Bonjour,
Je rencontre quelques problèmes (et oui encore moi ) 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:Voici mon code : (quasi copier coller du tutoriel)invalid value for shared scalar at....
L'objet est "édité" via l'interface et une fois cela fait, on lance le calcul par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
le bouton Tk:
Merci d'avance pour vos lumières.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ... }
Partager