在Perl中使用线程ID唤醒睡眠线程有什么方法吗?在此先感谢如何在Perl中唤醒线程
下面是我所使用挂起和恢复
use warnings;
use strict;
use threads;
use threads::shared;
use Thread::Suspend;
my $val:shared = 0;
my $count = 0;
while ($count < 4)
{
my $thr = threads->create(\&worker);
$count++;
}
use Tk;
my $mw = MainWindow->new();
$mw->protocol('WM_DELETE_WINDOW' => sub { &clean_exit });
my $thr;
my $button;
$button = $mw->Button(
-text => 'Invoke thread',
-command => sub{
$val += 1;
if($val > 4)
{
$val = 1;
}
foreach $thr (threads->list())
{
if($thr->tid() == $val)
{
$thr->resume();
goto OUTSIDE;
}
}
OUTSIDE:
})->pack();
MainLoop;
sub clean_exit
{
my @running_threads = threads->list;
if (scalar(@running_threads) < 1)
{
print "\nFinished\n";
exit;
}
else
{
foreach my $thr (threads->list())
{
$thr->kill('KILL')->detach();
}
exit;
}
}
sub worker
{
$SIG{'KILL'} = sub { threads->exit(); };
threads->suspend();
print threads->tid()."\n";
}
我所试图做的是当调用按钮,用户点击它应该恢复基于$ VAL线程尝试。但它不以这种方式工作。第一个ID为4的线程在4次点击而不是1后恢复。请帮助调试代码。附:我是Perl的新手
明白了。而不是使用threads-> suspend(),我们必须使用threads-> self() - > suspend()。 – Allwyn 2011-05-14 12:10:05