|
From: Eric B. <er...@eb...> - 2001-01-09 12:36:29
|
On Wed, 3 Jan 2001, Robert Sherman wrote:
> sub Loop_Click {
> while ($i<20) {
> sleep 1;
> if ($i==10){
> &Show_Win2($i);
> }
> $i++;
> }
> }
One way to do this is to use a timer:
# Warning: Untested code
my $loop_counter;
my $LoopTimer = Window->AddTimer("LoopTimer", 0);
sub Loop_Click {
$loop_counter = 0;
$LoopTimer->Interval( 1000 );
# Use a short interval if all you want is event procesing.
# Here the 1000ms interval substitutes for your sleep 1.
}
sub LoopTimer_Timer {
&Show_Win2( $loop_counter ) if $loop_counter == 10;
++$loop_counter;
$LoopTimer->Kill() if $loop_counter >= 20;
}
If you have a lot of loop state and you don't want it all at file level
you can also use a closure. This has a side effect of making the timer
generic.
# Warning: Untested code
my $loop_body;
my $LoopTimer = Window->AddTimer("LoopTimer", 0);
sub Loop_Click {
my $loop_counter = 0;
$loop_body = sub {
&Show_Win2( $loop_counter ) if $loop_counter == 10;
++$loop_counter;
$LoopTimer->Kill() if $loop_counter >= 20;
}
$LoopTimer->Interval( 1000 );
}
sub LoopTimer_Timer {
$loop_body->();
}
This could be done very nicely with perl-level threads. (i.e. one at a
time but with multiple call stacks where one could pass control to
another)
- Eric B.
--
"An intelligent carrot! It boggles the mind."
|