IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques Perl Discussion :

[PERL/TK] Thread et ProgressBar


Sujet :

Interfaces Graphiques Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 11
    Par défaut [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):

    Thread 1 terminated abnormally: Can't call method "value" on an undefined value at **** line ***
    Définition du thread:
    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:
    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
    }
    Fonction lancer par le thread:
    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!!

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Bonjour,

    Votre message d'erreur signifie que la méthode value est lancée sur une variable non connue
    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;
    	}
    }
    En l'occurrence, $progress n'est pas connue dans cette procédure (surtout si cette dernière est lancée dans un thread). Mais vu que ce sera une variable Tk, je pense que ça posera souci comme je l'ai spécifié dans le tutoriel.

    Inconvénients Perl Tk et Threads

    1. La version actuelle de Perl/Tk (Tk-804.028) n'est pas "thread safe" d'après les auteurs.
    2. L'utilisation des threads avec Perl Tk n'est pas simple.
    3. Le partage des données entres processus légers et/ou script principal n'est pas toujours évident.
    4. Il est recommandé de créer ses threads avant tout code TK et ne pas faire apparaître de code TK dans les threads.
    5. On ne peut donc pas créer des threads à la volée comme bon nous semble via un click bouton.


    Mais néanmoins, je ne vois pas l'intérêt de faire cette barre de progression. Vous pouvez à la place de la barre de progression, mettre un widget label avec l'option -textvariable. Puis à la fin de la tache du thread, mettre à jour cette variable. En jouant également avec des couleurs si vous le souhaitez.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 11
    Par défaut
    Merci pour votre rapidité!!

    Je ne peux donc pas utiliser les progressBar avec les thread?
    Dans le tuto il est pourtant dit
    Vous pouvez vous inspirer de ces scripts : PerlTkThreadPropreFinal pour l'utilisation des threads et ScriptProgressBar pour l'utilisation des barres de progression.
    Je pense que cela signifie que cela est réalisable mais je n'arrive pas à voir comment sans utiliser de code TK.

    Ensuite même avec les labels je ne vois pas comment je peux faire car je ne veux pas récupérer une valeur a la fin du thread mais plutôt mettre à jour le label tout le long du thread.
    Le thread me sert à récupérer la taille de destination par rapport a la taille du fichier pour voir combien il me reste à transférer et donc faire évoluer la barre de progression jusqu'à la fin de la barre (qui met fin au thread).

    Merci pour votre aide.

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Avez réellement besoin d'utiliser les threads dans votre programme ? Quel est le but concret de votre programme ?

    Dans l'article, j'explique comment
    1. soit utiliser uniquement une barre de progression dans son programme
    2. soit utiliser les threads

    Il est possible d'utiliser des threads et barre de progression au sein du même programme, mais impossible d'utiliser des barres de progression à l'intérieur des threads, car perl ne gère pas le partage des variables Tk entre le processus principal et les threads.

    Dans votre cas, si l'objectif est de voir l'état d'avancement de la lecture d'un fichier ou autres tâches, il est plus judicieux de n'utiliser qu'une barre de progression sans s'embêter avec les threads. Nous pouvons vous aider à la faire, mais il faut nous expliquer le but de votre programme.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 11
    Par défaut
    Alors je m'explique:

    Je veux utiliser les thread tout simplement pour pouvoir effectuer deux choses en simultané.

    Mon programme permet de faire du transfert de fichier.

    Au moment où l'utilisateur clique sur transférer, le programme principale transfert un fichier d'un point A vers B et le thread doit faire un calcule de taille pour savoir a combien de % en est le transfert et l'affiche sur la progressBar.

    Je ne vois pas comment effectuer ces deux actions en parallèle sans utiliser de thread?

    Merci pour votre aide précieuse! Vous m'évitez de perdre beaucoup de temps!

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Ok, nous avançons déjà un peu. Alors, Comment sont fait les transferts, en FTP ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème Thread et progressbar
    Par AnsuzPeorth dans le forum GTK+ avec Python
    Réponses: 2
    Dernier message: 19/03/2010, 12h56
  2. thread et progressBar sous Visual C++
    Par goingoin dans le forum VC++ .NET
    Réponses: 5
    Dernier message: 19/03/2009, 16h59
  3. Thread et ProgressBar
    Par Jidewe dans le forum VB.NET
    Réponses: 3
    Dernier message: 27/05/2008, 10h04
  4. Background Thread et ProgressBar
    Par bgcode dans le forum VB.NET
    Réponses: 17
    Dernier message: 05/07/2007, 13h30
  5. Réponses: 1
    Dernier message: 22/09/2005, 20h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo