[PERL/TK] Thread et ProgressBar
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):
Citation:
Thread 1 terminated abnormally: Can't call method "value" on an undefined value at **** line ***
Définition du thread:
Code:
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:
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:
Code:
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
} |
Fonction lancer par le thread:
Code:
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:
fct_lancement_thread($taillesrc,$tailledest,$$ptPATH_RESTORE{$cle},$$ptARG_NAME{$cle},$cle);
Merci par avance!!