2011-05-14 66 views
1

在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的新手

+0

明白了。而不是使用threads-> suspend(),我们必须使用threads-> self() - > suspend()。 – Allwyn 2011-05-14 12:10:05

回答

4
#!/usr/bin/perl 
use warnings; 
use strict; 
use threads; 
use threads::shared; 
use Thread::Suspend; 

my $val:shared = 0; 
my $count = 0; 
my @thr; 

while ($count < 4) 
{ 
    $thr[$count] = threads->create(\&worker, $count); 
    $count++; 
} 

use Tk; 
my $mw = MainWindow->new(); 
$mw->protocol('WM_DELETE_WINDOW' => sub { &clean_exit }); 
my $button; 
$button = $mw->Button(
     -text => 'Invoke thread', 
     -command => sub{ 
      foreach my $th (@thr) 
      { 
        print "Resuming...\n"; 
        $th->resume(); 
      } 
     })->pack(); 

MainLoop; 

sub clean_exit 
{ 
    my @running_threads = threads->list; 
    if (scalar(@running_threads) < 1) 
    { 
     print "\nFinished\n"; 
     exit; 
    } 
    else 
    { 
     foreach my $th (@thr) 
     { 
      $th->kill('KILL')->detach(); 
     } 
     exit; 
    } 
} 

sub worker 
{ 
    my($id)[email protected]_; 
    $SIG{'KILL'} = sub { print "Die...\n";threads->exit(); }; 
    threads->self->suspend(); 
    print "Worker:Resuming....\n"; 
    while(1){ 
     print threads->tid()." $id\n"; 
     sleep(1); 
    } 
} 
+3

小心为他人解释这段代码是关于什么的?没有上下文给这个答案,只是一个代码转储... – t0mm13b 2012-10-08 14:44:04

+0

我试图解释如何恢复线程后点击按钮。工作者线程是一个无限循环打印自己的ID。仅在单击后才打印ocurrurs ... – 2012-10-08 21:15:38