2017-09-19 8 views
0

J'utilise le code Perl suivant sur l'environnement Windows:perl sur les fenêtres coincées sur les appels à usleep d'un autre module

use Time::HiRes qw(usleep); 

    #(some code here) 

$self->{GLOBAL_OBJ}->xsleep($delay) if($delay); 


sub xsleep {  
    my $seconds = shift; 
    #print "will sleep:$seconds seconds\n"; 
    $seconds = $seconds * 1000000; 
    usleep($seconds); 
    #print "slept:$seconds micro seconds\n"; 

    return 0; 
} 

Quand j'appelle xsleep comme ça (d'un autre module), le système est bloqué et je Je ne peux l'arrêter que par ctrl + c, mais quand je l'appelle depuis le module actuel, ça marche bien.

Quelqu'un peut-il me dire pourquoi c'est et comment puis-je le réparer? Merci

+2

Si vous allez dormir dans des unités de secondes, pourquoi ne pas simplement utiliser le sommeil (deuxième résolution)? Vous devrez peut-être aussi accepter le param comme 'my ($ self, $ seconds) = @_;' dans la première ligne de votre sous-routine xsleep. – xxfelixxx

+1

merci @xxfelixxx, c'était le problème de $ self. –

Répondre

1

xsleep est appelée en tant que méthode, ce qui signifie que l'invocant (le résultat du côté gauche de ->) est passé en tant que premier argument. Cela se termine actuellement dans $seconds. Les références sont numérisées à leur adresse, de sorte que vous obtenez un nombre extrêmement élevé dans $seconds. Par exemple,

$ perl -e'CORE::say(0+{})' 
9304720 

Rectifiez xsleep de sorte qu'il peut être appelé comme méthode,

$self->{GLOBAL_OBJ}->xsleep($delay) if $delay; 

sub xsleep {  
    my $self = shift; 
    my $seconds = shift; 
    ... 
} 

ou appelez xsleep comme un sous

The::Package::xsleep($delay) if $delay; 

sub xsleep {  
    my $seconds = shift; 
    ... 
}