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 Kerro . Évalué à 4.
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 roduit (site web personnel) . Évalué à 1.
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 djibb (site web personnel) . Évalué à 2.
ça lance dans un thread donc tu as rien a gérer.
[^] # Re: Threads
Posté par Kerro . Évalué à 2.
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 roduit (site web personnel) . Évalué à 1.
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 Kerro . É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 roduit (site web personnel) . Évalué à 2.
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 LaBienPensanceMaTuer . Évalué à 1.
[^] # Re: solution sale
Posté par roduit (site web personnel) . Évalué à 1.
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.