in reply to Re: break thread with system(...) call
in thread break thread with system(...) call

Sorry, such thing will not work.
1) Win32::Process does what you say even more elegantly..
2) Everything around threads and shared things I have implemented - such a wrapper
3) So, this will not work because of I will have to use complex commands, such as system ("FOR /R %g DO prog.exe %g ")
So, you see, common process launch will not work :(

But nevertheless, Thanks for useful info about that alarms don't work well with threads!).. now I don't know what to do.

If there will be no ideas, I'll use .bat-files or Win32::Process..
  • Comment on Re^2: break thread with system(...) call

Replies are listed 'Best First'.
Re^3: break thread with system(...) call
by ikegami (Patriarch) on Jul 16, 2008 at 20:25 UTC
    Contrary to what you said, (3) will work with CreateProcess. Remember that it's a shell command, so launch cmd.exe to execute the command. system uses CreateProcess, so anything system can do, so can CreateProcess.
      zentara, your solution seems to look well, but really it doen't match all requests under windows..

      I've found solution, please look below if interesting)
Re^3: break thread with system(...) call
by zentara (Cardinal) on Jul 16, 2008 at 19:55 UTC
    A separate timer thread will work if you set it up right, I don't understand why it wouldn't. You start 2 threads, which run independent. When the timer reaches the end of it's code block, if a finished flag isn't set, it kills the pid from the other thread. But I don't use windows, and maybe I don't experience it's peculiarities. This works on linux. (Granted it is easier if you have an eventloop system in main).
    #!/usr/bin/perl -w use strict; use threads; use threads::shared; #my $finished:shared = 0; my $timer_go:shared = 0; #my $worker_go:shared = 0; #my $worker_pid:shared = ''; my $worker = threads->create(\&worker); my $timer = threads->create(\&timer,$worker); print "hit enter to start\n"; <>; $timer_go=1; <>; $timer->join(); $worker->join(); sub timer { my $worker = shift; while(1){ if($timer_go){ my $count = 0; while(1){ $count++; if($count > 5){ print "timed out\nHit enter to finish\n"; # Send a signal to a thread $worker->kill('INT'); return; } sleep 1; print "timing $count\n"; } }else{sleep 1} } } sub worker { $|++; $SIG{INT} = sub{ warn "Caught Zap!\n"; sleep 1; exit; }; my $worker_pid = open( READ, "top -d 1 -b |" ); print "\t$worker_pid\n"; return; }

    I'm not really a human, but I play one on earth CandyGram for Mongo