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

Tkinter Python Discussion :

[Thread] probléme de blocage.


Sujet :

Tkinter 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] probléme de blocage.
    bonsoir,

    je suis en train de dev un serveur pour du traitement d'image.
    j'ai besoin de lister des dossiers et d'afficher le résultat dans une Pmw.ScrolledListBox.
    A ce niveau c'est bon, pas de soucis ca marche, mes fonctions remplissent bien leur role.

    Là ou je bloque c'est pour la mise en place d'un thread permettant de mettre a jour cette liste dans ma listbox.

    j'ai créé un thread dans ma classe, dans mon __init__.
    mais quand je lance mon prog, si mon thread fonctionne, il empêche mon interface de se lancer.
    si je met ce même thread dans une fonction et que je l'appelle, c'est pareil.

    quelqu'un pourrait il m'aider a comprendre comment implenter des threads dans un prog avec interface graphique.

    merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    le seul truc qu'il faut faire attention en manipulant les thread et les interfaces graphiques (et ce quelque soit le GUI (Tkinter, wxPython, pyGTK)), c'est que tout se qui concerne l'IHM doit être fait dans le thread principal.

  3. #3
    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
    Bonjour,

    Pour ce qui est du thread principale qui doit être associer a mon GUI, je pense que c'est bien ca.
    Corrige moi si je me trompe

    Je fais une class Gui, c'est elle que je lance en premier. (donc normalement elle me crée un thread principal !?)
    dans cette class, dans mon __init__ je créer mon interface, puis un thread controlant le rafraichissement d'une listbox (normalement thread enfant!?)
    Je start ce thread, puis je fini par mon mainloop dans mon __init__.

    mais lorsque je lance mon prog, le thread enfant est bien lancé mais mon interface ne se lance pas!

    Est ce la bonne méthode, ou faut il que je crée une classe juste pour le lancement de mes threads.
    ex: création du thread pour la GUI
    creation du thread pour la fonction de rafraichissement
    start thread gui
    start thread rafraichissement

    merci par avance.

  4. #4
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Le mieux serait de poster le bout de code (si ce n'est pas trop long) de la création de ta classe. Normalement, tu n'as pas besoin d'avoir un thread pour le rafraichissement de ta listbox (après tout dépend les traitements que tu fait mais si tu as un traitement qui est long, ce traitement doit être fait dans le thread secondaire

    Exemple:
    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
    import threading
    import Tkinter as Tk
    import time
     
    root = Tk.Tk()
    lb1 = Tk.Listbox(root)
    lb1.pack()
    lb2 = Tk.Listbox(root)
    lb2.pack()
     
    def insert(lb, nbelem):
        for i in range(nbelem):
            lb.insert(0, i)
     
    def toto():
        a = threading.Thread(None, insert, None, (lb1, 10000))
        b = threading.Thread(None, insert, None, (lb2, 10000))                        
        a.start()
        b.start()
     
     
     
    btn = Tk.Button(root, text = 'toto', command=toto)
    btn.pack()
     
    root.mainloop()

  5. #5
    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 ne peux pas mettre un bout de code car il est trés long.

    mes traitements sont long mais ne doivent pas bloquer le Gui du serveur.
    en fait la fonction pour rafraichir mes Pmw.Scrolledlistbox n'est qu'une des nombreuse fonction qui doit s'executer en parralléle d'autres fonctions.

    au total je dois en avoir 6 ou 7.
    certaine fonction sont courte en execution d'autres peuvent en fonctions des données a traiter prendre plusieures dizaines de minutes!!!!

    Il faut donc que je puisse lancer mon interface puis tous les threads enfants.
    je les controle avec des lockers (if a==1: ....) a l'interieur des fonctions qui leur sont associées.
    les threads sont toujours en action

    Bon apparement aut trouver un moyen pour lancer les trheads aprés mon GUI


    Guigui, dans ton exemple, tu controles les thread par un bouton qui fait parti du Gui alors que dans mon cas je souhaite les créer dés le lancement du programme. Mais peut être que je vais voir pour gérer les choses comme ca!

    merci tout de même.

  6. #6
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Il faut que la fonction mainloop() soit exécuté avant tout autre traitement sur la GUI.

    Donc pour cela, tu peux faire un truc de ce style (pas sûr que ca marche)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    th = threading.Thread(None, self.root.mainloop, None, ())
    th.start()
    ## puis lancement des autres thread

Discussions similaires

  1. Thread problème d'inter-blocage
    Par Delnir dans le forum Débuter
    Réponses: 1
    Dernier message: 31/01/2011, 08h24
  2. [VB.Net][Threading] Problème de parent ...
    Par maitrebn dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/01/2006, 11h05
  3. Thread problème pour l'arreter
    Par rvzip64 dans le forum Langage
    Réponses: 8
    Dernier message: 12/07/2005, 10h51
  4. [Thread]Problème de processus
    Par berg dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 18/06/2005, 20h40
  5. Thread--> problème avec ThreadProc
    Par stof dans le forum MFC
    Réponses: 33
    Dernier message: 08/06/2005, 13h47

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