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

Python Discussion :

[Thread] Interface et thread


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Par défaut [Thread] Interface et thread
    Bonsoir,

    Et on remet ca! Je vais finir par péter un cable.

    Je suis toujours sur un problème de mise en place de thread.
    J'ai une interface graphique en tkinter/Tix/Pmw.
    cette interface est composé d'un notebook. chaque page de ce notebook (4 page), met en page une scrolledlistbox listant le contenu d'un dossier cible (différent pour chaque page) et des bouton de controle (deplacer dossier, effacer dossier).

    j'ai deux fonctions qui doivent cacune être mise dans un thread différent. la premiére rafraichi a interval régulier les scrolledlistbox. la 2eme test si un dossier defini X est vide ou nom. dans le cas ou celui ci est vide, la fonction copie le premier fichier contenu dans le dossier attaché au 1er scrolledlistbox.

    pour lancer mes thread mon code est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def mes_thread(self):
            ''' création des threads et lancement de ces derniers '''
            self.th_1=th.Thread(target=self.update_root)
            self.th_2=th.Thread(target=self.traitement_cmd)
     
            self.root.mainloop()
     
            self.th_1.start()
            self.th_2.start()
    Dans ce cas, mon interface se lance bien (et ne bloque pas!) mais met deux fonctions ne s'executent pas.

    voici en complément mon __init__ de ma Classe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def __init__(self):
     
            self.master_gui() ### construction de mon interface
            self.stat=1 ### definition d'une variable de controle
            self.initialisation()  ### fonction de vérification des paramétres de configuration
            self.lock=0 ### autre variable de controle
            self.mes_thread()  ### lancement de mes threads (voir ci haut)
    je n'arrive vraiment pas a mettre en route le systeme multithread.
    Pourriez vous me conseiller (malgré avoir lu et relu la doc, et des exemples, je sèche)
    Sachant que je dois y ajouter encore 2 thread de traitement minimum.

    mille merci d'avence

  2. #2
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Par défaut
    je teste, je teste et je fini par cerner le problème.

    en fait c'est là fonction de mise a jour des listbox qui fige mon appli.
    je ne sais vraiment pas pourquoi, mais en tout cas, c'est vraiment cette fonction qui fige.
    voici le code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    def __init__(self):
     
            self.master_gui()
            self.stat=1
            self.initialisation()
            self.lock=0
            self.temps=100
            self.th_1=th.Thread(target=self.update_root)
            self.th_1.start()
            self.root.mainloop()
     
     
    def update_root(self):
            if self.breaker==0:
                ''' mise a jour des listbox '''
                time.sleep(3)
                if self.nb.getcurselection() == 'ATTENTE':
                    a=self.listdirectory(path=self.initial_dir + '/QUEUE')
                    self.lbqueue.item_int_nb(a)
                    self.lbqueue.selection_set(self.cur)
     
                elif self.nb.getcurselection() == 'TERMINE':
                    a=self.listdirectory(path=self.initial_dir + '/FINISH')
                    self.lbfinish.item_int_nb(a)
                    self.lbfinish.selection_set(self.cur)
     
                elif self.nb.getcurselection() == 'MAINTIEN':
                    a=self.listdirectory(path=self.initial_dir + '/WAIT')
                    self.lbwait.item_int_nb(a)
                    self.lbwait.selection_set(self.cur)
     
                elif self.nb.getcurselection() == 'ERREUR':
                    a=self.listdirectory(path=self.initial_dir + '/ERROR')
                    self.lberror.item_int_nb(a)
                    self.lberror.selection_set(self.cur)
                self.root.update()
    puis les deux fonctions complémentaires utilisées par le fonction update_root()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def item_int_nb(self,items):
            self.lb.setlist(items)
     
     
        def selection_set(self,valeur):
            try:
                self.lb.selection_set(valeur)
            except:
                pass
    si vous pouviez m'aider, ca seait cool.
    merci d'avance

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 9
    Par défaut c'est la faute à...
    Regarde dans la doc de tkinter la fonction de mainloop(). C'est en fait une boucle sans fin qui ne rend pas la main au reste du programme, si tu lances des threads ca doit être AVANT tout appel a mainloop() !!!

    a+,
    void

  4. #4
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Par défaut
    c'est bien ce que j'ai fait.

    ce que je ne comprend pas, c'est que je lance deux thread enfants en cliquant sur un bouton. Le programme se fige aprés un temps x défini dans une de mes fonctions associée a un thread (time.sleep(x))

    j'ai testé les deux fonctions l'une indépendement de l'autre, et j'ai defini qu'il y a en fait une seule fonction qui pose problème (mais c'est peut être l'arbre qui cache la forêt!)

    bref, si je lance uniquement le thread associé a la fonction qui fonctionne, ca roule! Mon interface ne fige pas.
    Mais si j'essaie avec l'autre thread, toujours le même problème.

    si vous avez des suggestions!

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 9
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def mes_thread(self):
            ''' création des threads et lancement de ces derniers '''
            self.th_1=th.Thread(target=self.update_root)
            self.th_2=th.Thread(target=self.traitement_cmd)
     
            self.root.mainloop()
     
            self.th_1.start()
            self.th_2.start()
    le self.root.mainloop() n'a rien a faire la !

    Void

  6. #6
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Par défaut
    ok, si je le met autre part, (cad aprés les th_1.start(), et th_2...) le prog s'ouvre et se ferme tout de suite.
    Je viens de trouver une solution mais franchement je ne comprend pas pourquoi ca marche comme ca.
    Tout part d'une premiére erreur de prog, voir ci joint:
    http://www.developpez.net/forums/sho...d.php?t=255486

    comment j'ai procédé: dans mon __init__(self):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        #### Initialisation 
    def __init__(self):
            
            self.master_gui()
            self.stat=1
            self.initialisation()
            self.lock=0
            self.temps=100
            
            self.th_1=th.Thread(self.update_root())
            self.th=th.Thread(self.root.mainloop())
    et pour lancer mon dernier thread via une action sur un bouton:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def mes_thread(self):
            ''' création des threads et lancement de ces dernières '''
            self.th_2=th.Thread(target=self.traitement_cmd)
            self.th_2.start()
    remarquez la syntaxe différente dans la construction de mes deux premier thread comparé a la construction du dernier.
    Ce dernier étant construit comme il le faut (comme dans la doc)

    Si quelqu'un a une explication je suis preneur, parceque là j'avoue que c'est incompréhensible.

    En tout cas ca fonctionne et mon interface ne fige plus

    seul soucis c'est que je suis incapable de savoir si mes deux premiers threads sont bien détruit lorsque je quitte mon prog.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 05/09/2014, 17h02
  2. affichage interface et thread
    Par cyrull dans le forum wxPython
    Réponses: 5
    Dernier message: 23/02/2009, 07h45
  3. Thread, Interface et Controler
    Par LordBob dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 18/11/2007, 00h30
  4. [Threads et interface] le thread bloque tout
    Par meda dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 28/10/2004, 16h52
  5. Réponses: 3
    Dernier message: 11/02/2004, 12h50

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