Bonjour à tous,
J'ai un petit problème à utiliser un thread pour lancer une progressBar dans une nouvelle fenêtre.
J'ai lu le très bon tuto sur les applications Multi threading sur ce site, je pense avoir compris les thread mais malheureusement la partie Thread avec ProgressBar n'y est pas.
Si quelqu'un l'a fait, je pense que cela pourrait m'aider.
Sinon en fait mon problème et que je lance ma fonction qui réveille mon thread (cela fonctionne bien), ensuite le thread lance bien la bonne fonction donné en paramètre avec les bon argument. Et dans cette fonction je change la valeur de la progressBar pour faire avancer la bar mais il me dit qu'il ne peut pas appeler la méthode "value" (value est utilisé pour donner une valeur a la progressBar):
Définition du thread:Thread 1 terminated abnormally: Can't call method "value" on an undefined value at **** line ***
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 my %LesFonctionsALancerDansThread = ( "Transfert" => \&fct_transfert_thread ); 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 arguements à 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 my $Thread = threads->create( \&NotreThreadUnique ); #creation thread
Processus qui tourne attendant que le thread se réveille:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 sub NotreThreadUnique { while (1) { # Tourne en rond if ( $ThreadTravail == 1 ) { # demande au thread de travailler $LesFonctionsALancerDansThread{$NomFonction}->(@ArgumentsThread); # Lance la procédure $ThreadTravail = 0; # demande au thread de dormir } last if ( $TuerThread == 1 ); # Terminer le thread sleep 0.5; } return; }
Fonction qui réveille le thread:
Fonction lancer par le thread:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 sub fct_lancement_thread{ my ($taille_file,$taille_dest,$src,$dest,$file) = @_; $NomFonction = "Transfert"; # On lui indique la procédure à appeler @ArgumentsThread = ($taille_file,$taille_dest,$src,$dest,$file); # On lui donne les arguments $ThreadTravail = 1; # On lui demande de bosser }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 sub fct_transfert_thread{ my ($taille_file,$taille_dest,$src,$dest,$file) = @_; my ($overquota_actu,$taillesrc_actu,$tailledest_actu,$soustraction)=(0,0,0,0); while ($soustraction<$taille_file) { ($overquota_actu,$taillesrc_actu,$tailledest_actu)=fct_calcul_taille("$src$file","$dest"); $soustraction=$taille_dest-$tailledest_actu; $progress->value($soustraction) ; $tprogress->update; } }
Appelle de la fonction qui lance le thread:
Code : Sélectionner tout - Visualiser dans une fenêtre à part fct_lancement_thread($taillesrc,$tailledest,$$ptPATH_RESTORE{$cle},$$ptARG_NAME{$cle},$cle);
Merci par avance!!
Partager