1. Parallelling system_exec

I'm using system_exec in a command-line program (although executing
using exw.exe) to run the curl utility a number of times (with a
god-awfully long lost of parameters that uploads a file to a
particular server, waits for the server to process it, then downloads
the result to a file)

Problem is, it takes about 2 minutes per instance. How can I run all
of them at once? I'm not using win32lib at all, or any external
functions yet.
-- 
MrTrick

new topic     » topic index » view message » categorize

2. Re: Parallelling system_exec

First, download Bernie Ryan's "Win32 Engine" from the archive.  Below is an
include file I use to spawn child processes without waiting on them before
continuing. To use it:

handle = child_process(<command line here>)

-- the above runs the program specified by command-line
-- and returns a integer handle, or 0 on error
-- example: handle = child_process("c:\\curl_dir\\curl.exe -whatever whatever")


If you aren't going to use the handle for anything (sounds like you aren't),
then immediately call:

child_close(handle)  -- closes the handle only (releases resources), doesn't
affect the child program itself



To terminate immediately a child program (abnormal termination), use:

child_kill(handle) -- handle must still be open (it will close it upon
termination)


I use the second two procedures because I monitor the child processes via
interprocess communication -- doesn't sound like you need that.

-- Andy




------------------------------------------------------
include w32engin.ew

without warning


constant
TRUE = 1,
FALSE = 0,
NULL = 0

object void

global function child_process(sequence cmdline)
atom piProcInfo, siStartInfo, addr, hChildProcess
integer bFuncRetn

addr = allocate_string(cmdline) -- command to run child program ("exwc
program.exw")

	-- Set up members of the PROCESS_INFORMATION structure.
	piProcInfo = struc("PROCESS_INFORMATION")


	-- Set up members of the STARTUPINFO structure.
	siStartInfo = struc("STARTUPINFO")
	put(siStartInfo,"cb",sizeof("STARTUPINFO"))


	-- Create the child process.
   bFuncRetn = CreateProcessA({
      NULL,       -- app name (we use command line instead)
      addr,			-- command-line
      NULL,          -- process security attributes
      NULL,          -- primary thread security attributes
      FALSE,          -- handles are not inherited
      0,             -- creation flags
      NULL,          -- use parent's environment
      NULL,          -- use parent's current directory
      siStartInfo,   -- STARTUPINFO pointer
      piProcInfo})   -- receives PROCESS_INFORMATION

	free(addr)

	if bFuncRetn = 0 then
		free_mem(siStartInfo)
		free_mem(piProcInfo)
		return 0 -- error
	else
		hChildProcess = grab(piProcInfo,"hProcess")
		void = CloseHandle(grab(piProcInfo,"hThread"))
		free_mem(siStartInfo)
		free_mem(piProcInfo)
		return hChildProcess -- return handle to process
	end if

end function


global procedure child_kill(atom hChildProcess)
	if hChildProcess then
		void = TerminateProcess({hChildProcess,0})
		void = CloseHandle(hChildProcess)
	end if
end procedure

global procedure child_close(atom hChildProcess)
	if hChildProcess then
		void = CloseHandle(hChildProcess)
	end if
end procedure

--------------------------------------------------------


new topic     » goto parent     » topic index » view message » categorize

3. Re: Parallelling system_exec

Wait....

I'm writing a script that just has to call an executeable roughly 20
times. All I want is for the code to return immediately from the
system call, not wait for the executeable to finish (most of the time
is on the server).

There are no gui elements to this script at all... I don't want to be
shackled to a gui library.

What about the win32lib shellExecute? Does it wait for the program to
finish? Or what about the "start" moniker. Does it allow parameter
passing?

On Sun, 27 Jun 2004 22:44:01 -0700, Andy Serpa <guest at rapideuphoria.com>
wrote:
> 
> 
> posted by: Andy Serpa <ac at onehorseshy.com>
> 
> First, download Bernie Ryan's "Win32 Engine" from the archive.  Below is an
> include file I use to spawn child processes without waiting on them before
> continuing. To use it:
> 
> }}}
<eucode>
> handle = child_process(<command line here>)
> 
> -- the above runs the program specified by command-line
> -- and returns a integer handle, or 0 on error
> -- example: handle = child_process("c:\\curl_dir\\curl.exe -whatever
> whatever")
> </eucode>
{{{

> 
> If you aren't going to use the handle for anything (sounds like you aren't),
> then immediately call:
> 
> }}}
<eucode>
> child_close(handle)  -- closes the handle only (releases resources), doesn't
> affect the child program itself
> </eucode>
{{{

> 
> To terminate immediately a child program (abnormal termination), use:
> 
> }}}
<eucode>
> child_kill(handle) -- handle must still be open (it will close it upon
> termination)
> </eucode>
{{{

> 
> I use the second two procedures because I monitor the child processes via
> interprocess communication -- doesn't sound like you need that.
> 
> -- Andy
> 
> }}}
<eucode>
> 
> 
> without warning
> 
> constant
> TRUE = 1,
> FALSE = 0,
> NULL = 0
> 
> object void
> 
> global function child_process(sequence cmdline)
> atom piProcInfo, siStartInfo, addr, hChildProcess
> integer bFuncRetn
> 
>         addr = allocate_string(cmdline) -- command to run child program ("exwc
>         program.exw")
> 
>         -- Set up members of the PROCESS_INFORMATION structure.
>         piProcInfo = struc("PROCESS_INFORMATION")
> 
>         -- Set up members of the STARTUPINFO structure.
>         siStartInfo = struc("STARTUPINFO")
>         put(siStartInfo,"cb",sizeof("STARTUPINFO"))
> 
>         -- Create the child process.
>    bFuncRetn = CreateProcessA({
>       NULL,       -- app name (we use command line instead)
>       addr,                     -- command-line
>       NULL,          -- process security attributes
>       NULL,          -- primary thread security attributes
>       FALSE,          -- handles are not inherited
>       0,             -- creation flags
>       NULL,          -- use parent's environment
>       NULL,          -- use parent's current directory
>       siStartInfo,   -- STARTUPINFO pointer
>       piProcInfo})   -- receives PROCESS_INFORMATION
> 
>         free(addr)
> 
>         if bFuncRetn = 0 then
>                 free_mem(siStartInfo)
>                 free_mem(piProcInfo)
>                 return 0 -- error
>         else
>                 hChildProcess = grab(piProcInfo,"hProcess")
>                 void = CloseHandle(grab(piProcInfo,"hThread"))
>                 free_mem(siStartInfo)
>                 free_mem(piProcInfo)
>                 return hChildProcess -- return handle to process
>         end if
> 
> end function
> 
> global procedure child_kill(atom hChildProcess)
>         if hChildProcess then
>                 void = TerminateProcess({hChildProcess,0})
>                 void = CloseHandle(hChildProcess)
>         end if
> end procedure
> 
> global procedure child_close(atom hChildProcess)
>         if hChildProcess then
>                 void = CloseHandle(hChildProcess)
>         end if
> end procedure
> 
> 
> 
> 
> 


-- 
MrTrick

new topic     » goto parent     » topic index » view message » categorize

4. Re: Parallelling system_exec

> I'm writing a script that just has to call an executeable roughly 20
> times. All I want is for the code to return immediately from the
> system call, not wait for the executeable to finish (most of the time
> is on the server).
> 
> There are no gui elements to this script at all... I don't want to be
> shackled to a gui library.
> 
> What about the win32lib shellExecute? Does it wait for the program to
> finish? Or what about the "start" moniker. Does it allow parameter
> passing?
> 

shellExecute (using a no-win32lib hack, searched the forum for info)
doesn't seem to be working for me either... it will run a simple
program, but it won't take command-line parameters...


-- 
MrTrick

new topic     » goto parent     » topic index » view message » categorize

5. Re: Parallelling system_exec

Patrick Barnes wrote:
> 
> Wait....
> 
> I'm writing a script that just has to call an executeable roughly 20
> times. All I want is for the code to return immediately from the
> system call, not wait for the executeable to finish (most of the time
> is on the server).
> 
> There are no gui elements to this script at all... I don't want to be
> shackled to a gui library.
> 

The code I provided does just that -- allows you to run a program without
waiting on a return value.  No GUI is needed, but it does use the Windows API and
Bernie's windows engine.  To run something several times without any interaction,
just do:

handle = child_process("program.exe")
child_close(handle)
handle = child_process("program.exe")
child_close(handle)
handle = child_process("program.exe")
child_close(handle)
handle = child_process("program.exe")
child_close(handle)


All 4 instances will start up nearly simulataneously, and the calling program
can go ahead and exit if desired...

new topic     » goto parent     » topic index » view message » categorize

6. Re: Parallelling system_exec

> shellExecute (using a no-win32lib hack, searched the forum for info)
> doesn't seem to be working for me either... it will run a simple
> program, but it won't take command-line parameters...

If something crazy like this works for me, then..... ?

----
function alloc_str(sequence s)
atom mem
mem=machine_func(16,length(s)+1)
if mem then poke(mem,s) poke(mem+length(s),0) end if
return mem
end function

constant
 C_INT=#01000004
,sh32=machine_func(50,"shell32.dll")
,shEx=machine_func(51,{sh32,"ShellExecuteA",
  {C_INT,C_INT,C_INT,C_INT,C_INT,C_INT},C_INT})
,action=alloc_str("open")
,prog=alloc_str("cdrecord.exe")
,params=alloc_str(" -v -dummy -data -dev=0,1,0 test.iso")
,dir=alloc_str("d:\\unzipped\\cdrtools\\")

atom ret
ret=c_func(shEx,{0,action,prog,params,dir,1})
if ret < 33
 then printf(1,"shell_error#%d %s\n",{ret,"..oops"})
 machine_proc(64,3)
end if

new topic     » goto parent     » topic index » view message » categorize

7. Re: Parallelling system_exec

Andy wrote:

> Patrick Barnes wrote:
>>
>> Wait....
>>
>> I'm writing a script that just has to call an executeable roughly 20
>> times. All I want is for the code to return immediately from the
>> system call, not wait for the executeable to finish (most of the time
>> is on the server).
>>
>> There are no gui elements to this script at all... I don't want to be
>> shackled to a gui library.
>>
>
> The code I provided does just that -- allows you to run a program
> without waiting on a return value.  No GUI is needed, but it does use
> the Windows API and Bernie's windows engine.  To run something several
> times without any interaction, just do:
>
> }}}
<eucode>
> handle = child_process("program.exe")
> child_close(handle)
> handle = child_process("program.exe")
> child_close(handle)
> handle = child_process("program.exe")
> child_close(handle)
> handle = child_process("program.exe")
> child_close(handle)
> </eucode>
{{{

>
> All 4 instances will start up nearly simulataneously, and the calling
> program can go ahead and exit if desired...

Why not use system()? It also calls the child processes asynchronously,
or am I missing something? The following code works fine on my system
(Windows 98):

system("explorer.exe.", 2)
system("calc.exe.", 2)
system("notepad.exe.", 2)
system("charmap.exe.", 2)


Regards,
   Juergen

new topic     » goto parent     » topic index » view message » categorize

8. Re: Parallelling system_exec

Juergen Luethje wrote:
> Why not use system()? It also calls the child processes asynchronously,
> or am I missing something? The following code works fine on my system
> (Windows 98):
> 
> <font color="#330033"></font>
> <font color="#FF00FF">system</font><font color="#330033">(</font><font
> color="#00A033">"explorer.exe."</font><font color="#330033">, 2)</font>
> <font color="#FF00FF">system</font><font color="#330033">(</font><font
> color="#00A033">"calc.exe."</font><font color="#330033">, 2)</font>
> <font color="#FF00FF">system</font><font color="#330033">(</font><font
> color="#00A033">"notepad.exe."</font><font color="#330033">, 2)</font>
> <font color="#FF00FF">system</font><font color="#330033">(</font><font
> color="#00A033">"charmap.exe."</font><font color="#330033">, 2)</font>
> <font color="#330033"></font>
> 

system() does not work asynchronously, at least on my system (with the Windows
interpreter -- maybe under DOS?).

e.g.

system("notepad.exe",2)

? 99 -- code not executed until notepad.exe is terminated

new topic     » goto parent     » topic index » view message » categorize

9. Re: Parallelling system_exec

On 28 Jun 2004, at 13:21, Andy Serpa wrote:

> 
> 
> posted by: Andy Serpa >ac at onehorseshy.com>
> 
> Juergen Luethje wrote:
> > Why not use system()? It also calls the child processes asynchronously,
> > or am I missing something? The following code works fine on my system
> > (Windows 98):
> > 
> > >font color="#330033">>/font>
> > >font color="#FF00FF">system>/font>>font 
color="#330033">(>/font>>font
> > color="#00A033">"explorer.exe.">/font>>font color="#330033">, 
2)>/font> >font
> > color="#FF00FF">system>/font>>font color="#330033">(>/font>>font
> > color="#00A033">"calc.exe.">/font>>font color="#330033">, 2)>/font> 
>font
> > color="#FF00FF">system>/font>>font color="#330033">(>/font>>font
> > color="#00A033">"notepad.exe.">/font>>font color="#330033">, 
2)>/font> >font
> > color="#FF00FF">system>/font>>font color="#330033">(>/font>>font
> > color="#00A033">"charmap.exe.">/font>>font color="#330033">, 
2)>/font> >font
> > color="#330033">>/font>
> > 
> 
> system() does not work asynchronously, at least on my system (with the 
Windows
> interpreter -- maybe under DOS?).
> 
> e.g.
> 
> system("notepad.exe",2)
> 
> ? 99 -- code not executed until notepad.exe is terminated

What about using Al Getz's Display Server to run and communicate with 
them?

Kat

new topic     » goto parent     » topic index » view message » categorize

10. Re: Parallelling system_exec

Andy Serpa wrote:

> posted by: Andy Serpa <ac at onehorseshy.com>
>
> Juergen Luethje wrote:
>> Why not use system()? It also calls the child processes asynchronously,
>> or am I missing something? The following code works fine on my system
>> (Windows 98):
    ^^^^^^^^^^

>> <font color="#330033"></font>
>> <font color="#FF00FF">system</font><font color="#330033">(</font><font
>> color="#00A033">"explorer.exe."</font><font color="#330033">, 2)</font>
>> <font color="#FF00FF">system</font><font color="#330033">(</font><font
>> color="#00A033">"calc.exe."</font><font color="#330033">, 2)</font>
>> <font color="#FF00FF">system</font><font color="#330033">(</font><font
>> color="#00A033">"notepad.exe."</font><font color="#330033">, 2)</font>
>> <font color="#FF00FF">system</font><font color="#330033">(</font><font
>> color="#00A033">"charmap.exe."</font><font color="#330033">, 2)</font>
>> <font color="#330033"></font>

Rob, is this the way the EUforum message board quotes Eu code, that was
syntax highlighted in the original post? Is there a way to change this
behaviour? It should have been:

>> system("explorer.exe.", 2)
>> system("calc.exe.", 2)
>> system("notepad.exe.", 2)
>> system("charmap.exe.", 2)

> system() does not work asynchronously, at least on my system (with the
> Windows interpreter -- maybe under DOS?).

As I wrote, it does so on my *Windows* system. (It does so on my PC
under DOS, too). All 4 programs are executed almost simulataneously.
Which Windows version do you use (2000 or XP, I believe)?

Regards,
   Juergen

new topic     » goto parent     » topic index » view message » categorize

11. Re: Parallelling system_exec

Juergen Luethje wrote:
> Rob, is this the way the EUforum message board quotes Eu code, that was
> syntax highlighted in the original post? Is there a way to change this
> behaviour? 

When I have time, I might change the way I'm doing
the syntax highlighting. It looks ok when first posted
on the Message Board, but when you quote it, all that HTML
is messy looking, especially via e-mail. Maybe I'll remove
the HTML when you quote some colorized code, but I'll leave the 
eucode ... /eucode tags in place so it will be 
recolorized for the Message Board but not via e-mail.
(If you don't know what I'm talking about, don't worry...
I'm just thinking out loud.)

Regards,
   Rob Craig
   Rapid Deployment Software
   http://www.RapidEuphoria.com

new topic     » goto parent     » topic index » view message » categorize

12. Re: Parallelling system_exec

Juergen Luethje wrote:
> 
> 
> As I wrote, it does so on my *Windows* system. (It does so on my PC
> under DOS, too). All 4 programs are executed almost simulataneously.
> Which Windows version do you use (2000 or XP, I believe)?
> 
I understand that you're using Windows, but you didn't say if you were using the
Windows interpreter exw.exe (I am) or ex.exe.  I'm using WinXP Pro, but I don't
think it was any different when I had Win98.  The docs seem to indicate that it
waits for an exit value from the spawned program...

new topic     » goto parent     » topic index » view message » categorize

13. Re: Parallelling system_exec

At 06:17 PM 6/28/04 -0700, you wrote:
>
>
>posted by: Andy Serpa <ac at onehorseshy.com>
>
>Juergen Luethje wrote:
> >
> >
> > As I wrote, it does so on my *Windows* system. (It does so on my PC
> > under DOS, too). All 4 programs are executed almost simulataneously.
> > Which Windows version do you use (2000 or XP, I believe)?
> >
>I understand that you're using Windows, but you didn't say if you were 
>using the Windows interpreter exw.exe (I am) or ex.exe.  I'm using WinXP 
>Pro, but I don't think it was any different when I had Win98.  The docs 
>seem to indicate that it waits for an exit value from the spawned program...

I believe Andy is correct.

system("notepad.exe", 2)


This appears not to block because what is happening here is that the 
command shell called by system() is returning as soon as
it has launched notepad.exe, a Win32 program.  Try the following:


puts(1, "calling \"system(\"ex.exe\", 2)...\n")
system("ex.exe", 2)
puts(1, "calling \"system(\"notepad.exe\", 2)...\n")
system("notepad.exe", 2)
puts(1, "\n\n\n\n")
clear_screen()
? 99

while get_key()= -1 do

end while


This behaves the same whether I run it with EX.EXE or EXW.EXE ( I think; 
it's late and I'm tired).
The call to system("ex.exe", 2) blocks until you press ENTER.  EX.EXE is an 
extended DOS program and therefore blocks.

This all appears to be the same results you would get by typing the names 
of the programs at the command line in a DOS box.

         Bob

new topic     » goto parent     » topic index » view message » categorize

14. Re: Parallelling system_exec

>From: Andy Serpa <guest at RapidEuphoria.com>
>Reply-To: EUforum at topica.com
>To: EUforum at topica.com
>Subject: Re: Parallelling system_exec
>Date: Mon, 28 Jun 2004 18:17:47 -0700
>
>posted by: Andy Serpa <ac at onehorseshy.com>
>
>Juergen Luethje wrote:
> >
> >
> > As I wrote, it does so on my *Windows* system. (It does so on my PC
> > under DOS, too). All 4 programs are executed almost simulataneously.
> > Which Windows version do you use (2000 or XP, I believe)?
> >
>I understand that you're using Windows, but you didn't say if you were 
>using the Windows interpreter exw.exe (I am) or ex.exe.  I'm using WinXP 
>Pro, but I don't think it was any different when I had Win98.  The docs 
>seem to indicate that it waits for an exit value from the spawned 
>program...
>

   This has come up before.
http://www.listfilter.com/cgi-bin/esearch.exu?thread=1&fromMonth=6&fromYear=8&toMonth=8&toYear=8&keywords=%22system_exec()%22

AFAICT, there is no guarantee whether system/system_exec are asynchronous or 
not. It varies between systems, so it would be best if you used 
shellExecute, or whatever...

~[ WingZone ]~
http://wingzone.tripod.com/

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu