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

Alarms don't work well with threads. What is generally done, is to start a separate timer thread, and use shared variables to communicate between the 2. Probably if your prog.exe hangs, you will need to kill it by it's pid (or whatever on windows). So start your prog.exe in a thread, get it's pid and put it in a shared variable. At the same time, start your timer in another thread ( or in a Tk::After in main). When it timeouts, read the pid from the shared variable and kill it, if it hasn't finished.

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

Replies are listed 'Best First'.
Re^2: break thread with system(...) call
by aaaone (Initiate) on Jul 16, 2008 at 19:15 UTC
    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..
      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)
      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