Anyone more knowledgable, please correct the below:
Basically, you will either want to use Threads or multiple processes.I
don't have much experience with threads, and little more with
processes. From the pickaxe (Programming Ruby), it seems that threads
may wait for the operating system call to finish before allowing both
itself and all other threads to continue. A thread is also internal to
the currently running ruby or irb session, and as such are much more
useful executing ruby code. That being said, Threads provide alot of
neat features and such.
What you probably want is a new process.
fork do
`my_program.exe`
end
and then if you ever want you program to wait for the termination of
all your applications running, use:
Process.waitall
Note that forking and new processes and such are many times operating
system dependent. I have no clue as to if Windows supports this (I
think it does, it may be pipes that it has more issues with).
system seems to want the external process to complete before continuing.
exec seems to wait for completion of the external process as well. I
need to start an external process and then go on to the next command
without waiting for the external process to complete. It would also be
nice if I could capture a handle for the external process so that I
could check status or kill it later.
BTW, I only tested operation in IRB. I'll try both commands in a script
later.
joe
On Windows, fork in not implemented.
For this purpose I mainly use `start "" progname.exe` (note the double quotes:
if the first parameter has quotes, it's the title of the window. That
means `start "c:\Program Files\Anything.exe" won't start the
program...) start will start program and return, so ruby can
continue...
Jano
···
On 8/11/06, ilsemanetor@gmail.com <ilsemanetor@gmail.com> wrote:
Joe Percival wrote:
> I don't need details, just a push in the right direction.
>
> How do you start a series of external applications from within ruby (on
> windows). For example, I want to start mywebcamapp.exe and
> myweatherapp.exe.
>
> Also, is it possible to have a ruby script that will stop an external
> process?
>
> Thanks,
> joe
>
> --
> Posted via http://www.ruby-forum.com/\.
Anyone more knowledgable, please correct the below:
Basically, you will either want to use Threads or multiple processes.I
don't have much experience with threads, and little more with
processes. From the pickaxe (Programming Ruby), it seems that threads
may wait for the operating system call to finish before allowing both
itself and all other threads to continue. A thread is also internal to
the currently running ruby or irb session, and as such are much more
useful executing ruby code. That being said, Threads provide alot of
neat features and such.
What you probably want is a new process.
fork do
`my_program.exe`
end
and then if you ever want you program to wait for the termination of
all your applications running, use:
Process.waitall
Note that forking and new processes and such are many times operating
system dependent. I have no clue as to if Windows supports this (I
From my C time, it seems like the famous fork+exec+wait. I don't know if it's possible in ruby or in all platforms. May you can start a thread and run the system there.
De: list-bounce@example.com [mailto:list-bounce@example.com] Em nome de Joe Percival
Enviada em: quinta-feira, 10 de agosto de 2006 08:38
Para: ruby-talk ML
Assunto: Re: Start an external application - How?
David Jones wrote:
You could try using 'system', eg:
system("yourwebcamapp.exe")
system seems to want the external process to complete before continuing.
exec seems to wait for completion of the external process as well. I
need to start an external process and then go on to the next command
without waiting for the external process to complete. It would also be
nice if I could capture a handle for the external process so that I
could check status or kill it later.
BTW, I only tested operation in IRB. I'll try both commands in a script
later.
joe
system seems to want the external process to complete before continuing. exec seems to wait for completion of the external process as well. I need to start an external process and then go on to the next command without waiting for the external process to complete. It would also be nice if I could capture a handle for the external process so that I could check status or kill it later.
BTW, I only tested operation in IRB. I'll try both commands in a script later.
joe
Start up each process in a thread and when your at a port that you need to do something after the processes have completed wait for the threads to complete and continue.
system seems to want the external process to complete before continuing.
exec seems to wait for completion of the external process as well. I
need to start an external process and then go on to the next command
without waiting for the external process to complete. It would also be
nice if I could capture a handle for the external process so that I
could check status or kill it later.
This code works for me. If you start the process in a seperate thread
the rest of the Ruby script will continue to execute. To terminate it
you need some help from the operating system by using the win32ole
library http://www.ruby-doc.org/stdlib/libdoc/win32ole/rdoc/index.html
require 'win32ole'
program = "notepad.exe"
Thread.new {system(program)}
puts "Waiting 5 seconds before terminating " + program
sleep 5
class WIN32OLE
def to_a
a = ; self.each{ |p| a<<p }; a
end
end
If it helps, I use the following bit of code when I need to platform-independently start an external process within my test suites. It depends on win32/process being available on Windows.
Usage is: IWATestSupport.create_process(app_to_start)
i.e. IWATestSupport.create_process('webrick.rb')
module IWATestSupport
def self.create_process(args) @fork_ok = true unless @fork_ok == false
pid = nil
begin
raise NotImplementedError unless @fork_ok
unless pid = fork
Dir.chdir args[:dir]
exec(*args[:cmd])
end
rescue NotImplementedError @fork_ok = false
begin
require 'rubygems'
rescue Exception
end
begin
require 'win32/process'
rescue LoadError
raise "Please install win32-process to run all tests on a Win32 platform. 'gem install win32-process' or http://rubyforge.org/projects/win32utils"
end
cwd = Dir.pwd
Dir.chdir args[:dir]
pid = Process.create(:app_name => args[:cmd].join(' '))
Dir.chdir cwd
end
pid
end
end
Kirk Haines
···
On Fri, 11 Aug 2006, Jan Svitok wrote:
On Windows, fork in not implemented.
For this purpose I mainly use `start "" progname.exe` (note the double quotes:
if the first parameter has quotes, it's the title of the window. That
means `start "c:\Program Files\Anything.exe" won't start the
program...) start will start program and return, so ruby can
continue...