Problème utilisation methode shared_clone (module threads::shared)
Bonjour,
Je rencontre quelques problèmes (et oui encore moi :oops: :D) avec l'utilisation du module threads::shared et de la methode shared_clone en particulier. Et ceci malgré la lecture attentive du tutoriel de Djibril à ce sujet!
Je m'explique:
J'ai une fenêtre principale (TK) qui récupère des infos entrées par l'utilisateur;
Ces infos sont stockées dans un objet disons $obj.
Une fois ces infos saisies je lance un calcul grâce à une fonction d'un autre module disons "calcul"
et je stocke les résultats dans un répertoire disons $dirsave.
Lorsque l'utilisateur a fini de saisir ses données il valide par un clic et je lance alors:
La fonction de calcul: calcul($obj,$dir_save).
Comme j'ai bien fait (enfin j'ai cru) mes devoirs et surtout que je me suis fortement inspiré du tutoriel de Djibril,
J'ai bien déclaré mes variables partagées et fait un clone de $obj via la méthode shared_clone, pourtant j'ai encore
l'erreur classique:
Citation:
invalid value for shared scalar at....
Voici mon code : (quasi copier coller du tutoriel)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
my %fonctionsALancerDansThread =('calcul'=> \&calcul);
# Threads et variables partagées
my $obj = Obj->new();
my $clone_obj : shared;
$clone_obj = shared_clone($obj);
my $TuerThread : shared; # Permet de tuer le thread proprement
my $NomFonction : shared; # Contient le nom de la fonction à appeler
my $ThreadTravail : shared; # Contient la valeur permettant au thread de lancer une procédure
my @ArgumentsThread : shared; # Contient les arguments à passer à une éventuelle procédure
my @ResultatFonction : shared; # Contient le résultat des fonctions lancées dans le thread
$ThreadTravail = 0; # 0 : thread ne fait rien, 1 : il bosse
$TuerThread = 0; # 0 : thread en vie, 1 : thread se termine
# Création du thread
my $Thread = threads->create( \&MonThread);
#-------------------------------------------------------------------------------------------------
# Fonction MonThread:
#-------------------------------------------------------------------------------------------------
sub MonThread {
# Tourne en rond
while (1) {
# demande au thread de travailler
if ( $ThreadTravail == 1 ) {
# Lance la procédure
$fonctionsALancerDansThread{$NomFonction}->@ArgumentsThread);
# demande au thread de dormir
$ThreadTravail = 0;
}
# Terminer le thread
last if ( $TuerThread == 1 );
sleep 0.5;
}
return;
} |
L'objet est "édité" via l'interface et une fois cela fait, on lance le calcul par
le bouton Tk:
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
sub bouton_lance_calcul{
......
$NomFonction = "calcul"; # Procédure à appeler
@ArgumentsThread = ($clone_obj,$dirsave) ; # On lui donne les arguments
$ThreadTravail = 1; # On lance le thread
...
} |
Merci d'avance pour vos lumières.