Je me prends méchamment la tête de puis un moment sans trouver mon erreur.
J'ai un script avec deux threads qui se paratagent un hash de hash. L'un des thread (ecoute) ajoute ou modifie les valeurs du HoH alors que l'autre doit juste les afficher... Ca marche avec un hash simple mais pas avec un HoH...
Voilà le code:
#!/usr/bin/perl -w
use 5.008;
use strict;
use warnings;
use threads;
use threads::shared;
my %realtime :shared = ();
sub affiche {
while(1){
foreach my $util (keys %realtime) {
foreach (keys %{$realtime{$util}}) {
print ("$util->$_ : $realtime{$util}{$_} \n");
}
}
sleep(1);
}
}
sub ecoute {
<----> Coupure <---->
if ( ($resp{"Event"} eq "Newexten") && ($resp{"Application"} eq "Dial") ) {
($protocole, $agent) = split(/\//, substr($resp{"Channel"},0,-5));
$realtime{ $agent }{date} = localtime(time);
$realtime{ $agent }{phone} = $resp{"Extension"};
$realtime{ $agent }{channel} = $resp{"Channel"};
$realtime{ $agent }{lien} = $resp{"Context"};
$realtime{ $agent }{etat} = 'Numérotation';
}else {
<----> Coupure <---->
}}}
}
}
# Génère le thread d'écoute et le détache du prog principale
my $thr_ecoute = threads->create(\&ecoute);
#$thr_ecoute->detach;
my $thr_affiche = threads->create(\&affiche);
#$thr_affiche->detach;
while(1){sleep(1);}
et l'erreur provoquée en général:
Thread 1 terminated abnormally: Invalid value for shared scalar at /var/asterisk/moteur/testthread.pl line 73.
Thread 2 terminated abnormally: Invalid value for shared scalar at /var/asterisk/moteur/testthread.pl line 42.
Je penche pour une mauvaise déclaration de mon HoH et/ou de son contenu...
Si quelqu'un pouvez me suggérer une piste...
# pas simple
Posté par B. franck . Évalué à 2.
Peut-être que le contenu de ton hash n'est pas dans la même portée que ton hash...
As-tu essayé de déclarer ton hash vide complètement au début ?
[^] # Re: pas simple
Posté par Flavien . Évalué à 1.
Il me semble que je le déclare vide..
my %realtime :shared = ();
Le script plante dès que je touche à %realtime dans le thread:
$realtime{ $agent }{date} = localtime(time);
Si je place des données dans %realtime avant de créer mon thread ecoute, les données lui sont bien transférées...
[^] # Re: pas simple
Posté par B. franck . Évalué à 2.
ce que tu as trouvé sur le cpan est ce qu'il te faut
[^] # Re: pas simple
Posté par Flavien . Évalué à 2.
je devais donc faire ça:
my %realtime : shared;
$realtime{ $xxx } = &share( {} );
Merci de ton aide...
[^] # Re: piste
Posté par Flavien . Évalué à 1.
http://search.cpan.org/~jdhedden/threads-shared-1.05/shared.(...)
Ca doit être la solution.
Je vais tester...
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.