Как разбудить тему в Perl - PullRequest
1 голос
/ 14 мая 2011

Есть ли способ разбудить спящий поток, используя его идентификатор в 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";  
}

То, что я пытаюсь сделать, - это когда пользователь нажимает кнопку Invoke, он должен возобновить поток на основе $ val. Но это не работает таким образом. Первый поток с идентификатором 4 - это возобновление после 4 нажатий вместо 1. Пожалуйста, помогите в отладке кода. Постскриптум Я новичок в Perl

1 Ответ

4 голосов
/ 08 октября 2012
#!/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)=@_;
    $SIG{'KILL'} = sub { print "Die...\n";threads->exit(); };
    threads->self->suspend();
    print "Worker:Resuming....\n";
    while(1){
        print threads->tid()." $id\n";  
        sleep(1);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...