GLib to the rescue. If you put the readkey in a thread, you can control the mainloop thru a shared variable. 's' makes it stop, 'g' makes it go, 'q' makes it exit.
#!/usr/bin/perl
use warnings;
use strict;
use Glib;
use Term::ReadKey;
use threads;
use threads::shared;
$|++;
ReadMode('cbreak');
my $go;
share($go); # order is important
$go = 1;
# works non-blocking if read stdin is in a thread
my $count = 0;
my $thr = threads->new(\&read_in)->detach;
my $main_loop = Glib::MainLoop->new;
my $timer = Glib::Timeout->add (1000, \&timer_callback, undef, 1 );
# can also have filehandle watches
#my $watcher;
#$watcher = Glib::IO->add_watch( fileno( $pty ), ['in', 'hup'], \&call
+back);
$main_loop->run;
ReadMode('normal'); # restore normal tty settings
sub timer_callback{
#do stuff
if($go){
$count++;
print "\n$count\n";
}
return 1;
}
sub read_in{
while(1){
my $char;
if (defined ($char = ReadKey(0)) ) {
print "\t\t$char->", ord($char),"\n";
#process key presses here
if($char eq 's'){$go=0}
if($char eq 'g'){$go=1}
if($char eq 'q'){exit}
# if(length $char){exit} # panic button on any key :-)
}
}
}
__END__
| [reply] [d/l] |
Assuming Win32, get yourself ProcessExplorer, it is what the TaskManager always should have been. One of many nice features is that it allows you to suspend and resume processes.
Alternatively, if the process produces regular output to the terminal, you can use ^S to suspend and any key to resume. And if you have your Command Prompt windows configured with "Quick Edit" setting, then left-clicking the window will suspend (assuming output) and right-click resume.
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
| [reply] |
And in the *nix world you can press Control-Z in the command window. Restart the app with fg.
(Update: this uses signals SIGSTP/SIGSTOP and SIGCONT -- assuming their default behavior.)
| [reply] [d/l] |
You could use Term::ReadKey to check if a key was pressed without blocking.
| [reply] |