Forum Programmation.perl Hash de Hash partagé entre Threads

Posté par  .
Étiquettes : aucune
0
27
nov.
2006
Bonjour,

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  . Évalué à 2.

    pas simple de voir l'erreur sans les numéros de lignes.
    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  . Évalué à 1.

      Bonjour Franck,

      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  . Évalué à 2.

        oui tu déclares le hash mais pas ses contenus qui eux sont créés dans le thread et donc privés.

        ce que tu as trouvé sur le cpan est ce qu'il te faut
        • [^] # Re: pas simple

          Posté par  . Évalué à 2.

          effectivement,

          je devais donc faire ça:

          my %realtime : shared;
          $realtime{ $xxx } = &share( {} );

          Merci de ton aide...
    • [^] # Re: piste

      Posté par  . Évalué à 1.

      J'ai trouvé ça...
      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 à ceux qui les ont postés. Nous n’en sommes pas responsables.