Forum Programmation.python Comment s'informer de l'évolution d'un processus qu'on a appelé ?

Posté par  (site web personnel) .
Étiquettes : aucune
0
6
déc.
2008
Bonjour à tous,

j'ai besoin de votre aide pour un blocage que j'ai sur Python.

Pour résumer, j'ai une librairie qui permet de lire des fichier. Par dessus, j'ai écris un gui en GTK qui permet d'afficher les images qui sont chargées. Le problème, c'est que comme les fichier sont relativement gros (100aines de Mo), cela prends du temps. L'appli gèle le temps de charger lesdits fichiers.

Ce que je voudrais, c'est, depuis le gui en GTK, suivre l'évolution de l'ouverture du fichier pour pouvoir y mettre une barre de progression.

Pour des raisons évidente d'indépendance de la librairie avec une gui particulière, je n'ai pas envie d'intégrer la barre dans la librairie.

Donc voilà où je suis bloqué. Comment faire que la librairie renseigne de son état d'évolution au script qui l'a lancer ? Je pensais un moment au threads, mais je n'y connais rien et donc je ne sais pas par ou commencer...

Tout conseil est le bienvenu.

Merci.
  • # Threads

    Posté par  . Évalué à 4.

    Si tu ne veux pas modifier ta bibliothèque pour qu'elle donne des infos, alors je ne vois pas comment un programme extérieurs pourrait en savoir plus.

    Il te faut un thread dans ton GUI afin d'appeler ta bibliothèque dans un thread, et d'afficher la barre dans un autre. Et pour afficher ta barre il est évident que c'est ta bibliothèque qui va donner les renseignements.

    Pour les threads, demande à Google, il sait beaucoup de choses à ce sujet.
    • [^] # Re: Threads

      Posté par  (site web personnel) . Évalué à 1.

      Salut,

      La question était justement comment faire pour que ma bibliothèque renseigne sur son état d'avancement. Mon seul soucis étant de laisser ma bibliothèque indépendant de la gui.

      Si les threads me permettent de faire ça, alors je m'y met.

      Merci
    • [^] # Re: Threads

      Posté par  (site web personnel) . Évalué à 2.

      oui il faut un thread...après, une des façons de faire, c'est de gérer avec un timer, qui apelle une fonction en thread tous les 5 secondes et actualise l'appli en GTK, c'est gtk.timout_add()

      ça lance dans un thread donc tu as rien a gérer.
      • [^] # Re: Threads

        Posté par  . Évalué à 2.

        C'est plutôt l'inverse :-)

        Le thread dans le GUI contacte la bibliothèque lorsque ça lui chante pour avoir les infos.

        Il suffit que la bibliothèque stocke dans un endroit "partagé" l'état d'avancement de tel ou tel appel. On y accède typiquement avec un handle.
        • [^] # Re: Threads

          Posté par  (site web personnel) . Évalué à 1.

          Extra !

          J'ai donc mis un compteur dans la bibliothèque qui varie de 0 à 1. Je l'appelle du GUI dans un thread.

          thread.start_new_thread(objet.open,())

          Ensuite je fais un :

          while objet.compteur < 1:
          # code pour la barre de progression

          # suite du programme

          Donc ça marche, dans la console je peux voire s'incrémenter le compteur.

          Le seul soucis qui me reste est dans l'affichage de la barre de progression qui n'apparaît qu'à la fin du chargement du fichier (et donc à 100%), mais ça c'est une autre histoir...

          Merci beaucoup pour vos conseils !
          • [^] # Re: Threads

            Posté par  . Évalué à 2.

            Merci beaucoup pour vos conseils
            De rien :-) Il te faut maintenant envoyer un message de remerciement à chaque personne ayant contribué à ce fil, sinon la chaîne est rompue et mille bugs s'abatterons sur ton code.

            l'affichage de la barre de progression qui n'apparaît qu'à la fin du chargement du fichier
            A première vue, ton thread dans le GUI n'est pas bien implémenté. Ou alors ta bibliothèque pose problème.
            Tente de faire en sorte que ton thread incrémente une valeur bidon (sans appels extérieurs) pour afficher la barre. Si la barre pose le même problème, c'est le GUI qui a un bug. Ensuite tu fais un appel extérieur vers autre chose que ta bibliothèque. Enfin tu vois le principe: isoler le problème.
            • [^] # Re: Threads

              Posté par  (site web personnel) . Évalué à 2.

              J'ai trouvé ce qui coinçait. GTK avait l'air de garder les évènements en attente car la sortie console marchait bien.

              J'ai donc rajouté pour chaque changement de valeur de la barre de progression ceci :

              while gtk.events_pending():
              ....gtk.mainiteration()

              et ça marche du tonner !

              (désolé pour l'indentation, mais j'ai l'impression que dlfp m'enlève les espace de début)

              Merci Milles fois à tous (pas envie de briser la chaîne... ;-) )
  • # solution sale

    Posté par  . Évalué à 1.

    Cette solution est sale et ralentira certainement ton appli, mais en appelant la fonction de chargement de tes images fichier par fichier, tu devrais pouvoir gérer facilement un pourcentage.
    • [^] # Re: solution sale

      Posté par  (site web personnel) . Évalué à 1.

      En fait, c'est un fichier qui fait une centaine de Mo. Donc c'est à l'intérieur de la bibliothèque que ça se passe.

      Dans la réponse du haut, on me dit que les threads permettraient communiquer sur l'évolution des processus, je crois que je vais voir dans cette voie.

      Merci

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.