2013-05-24 2 views
0

Я играл с этим кодом, начиная с того, как звучит звуковой сигнал, как только программа запускается, он не останавливается. Я подозреваю, что проблема связана с $thread->kill('KILL')->detach;.Perl thread kill не работает

Любые идеи? Или я сделал что-то не так?

#!c:/perl/bin/perl 

use threads; 
use Audio::Beep; 

my $thread; 
my $playing=0; 

while (1) { 
    my $val = int(rand(10)); 
    print "$val\n"; 

    # if event "start" occurs and is not playing create thread 
    #if (($val==0 || $val==1 || $val==2 || $val==3 || $val==4) && (!$playing)) { 
    if (($val==0 || $val==1 || $val==2) && (!$playing) ) { 
    $playing = 1; 
    $thread = threads->create( 
     sub { 
     local $SIG{'KILL'} = sub { threads->exit() }; 
     print "start beep\n"; 
     beep(520, 10000); 
     } 
    ); 
    } 
    # if event "end" occurs and playing wait 1 seconf and kill thread 
    elsif (($val==5) && $playing) { 
    print "stop beep \n"; 
    #sleep(1); 
    $playing = 0; 
    $thread->kill('KILL')->detach; 
    } 

    #sleep(1); 

    $count = 0; 
    for($i=0; $i<99999 ; $i++) { 
    $count++; 
    } 
} 
+0

установить звуковой сигнал и попробовать сценарий. он не останавливается ... вы можете заставить скрипт работать медленнее, дублируя цикл for 99999 ниже. раньше он работал очень медленно, и он все равно не останавливался. –

+0

Ваш бесконечный взгляд имеет 30% -ный шанс нанести 10-секундный звуковой сигнал и только 10% -ный шанс на попытку убить этот звуковой сигнал. Откуда вы знаете, что убийство не работает, а затем новый звуковой сигнал просто порожден? Если вы разместите печать внутри вашего обработчика SIG {KILL}, вызвана ли она? – pilcrow

ответ

0

Я думаю, что ваша программа в основном работает так, как вы планируете. Одна из проблем с тем, что я вижу сейчас, заключается в том, что каждый звуковой сигнал звучит одинаково. Я немного переписал его, чтобы дать звуковой сигнал некоторой текстуре и замедлить работу, чтобы вы могли оценить, что происходит.

Кроме того, как вы его написали, есть вероятность, что поток закончится сам по себе, прежде чем вы сможете его убить. Я сделал поток постоянным и добавил дополнительную диагностическую информацию, которая будет подтверждать, когда поток работает, а когда нет.

use strict; 
use warnings; 
use threads; 
use Audio::Beep; 

my $thread; 
my $playing=0; 

while (1) { 
    my $val = int(rand(30)); 
    print "$val\n"; 
    my $running = threads->list(threads::running); 
    print "Threads running: $running\n"; 

    # if event "start" occurs and is not playing create thread 
    if (($val==1) && (!$playing) ) { 
    $playing = 1; 
    print ">>>>>>>>\n"; 
    sleep(1); 
    $thread = threads->create( 
     sub { 
     local $SIG{'KILL'} = sub { threads->exit() }; 
     print "start beep\n"; 
     while (1) { 
      beep(520, 100); 
      sleep(1); 
      beep(3800, 100); 
      sleep(1); 
      beep(2000, 100); 
      sleep(1); 
     } 
     } 
    ); 
    } 
    # if event "end" occurs and playing wait 5 seconds and kill thread 
    elsif (($val==2) && $playing) { 
    print "STOPSTOPSSTOPSTOPSTOP\n"; 
    sleep(5); 
    $thread->kill('KILL')->detach; 
    $playing = 0; 
    } 

    for(my $i=0; $i<999999 ; $i++) {} 
}