Forum Programmation.python Thread interrompu

Posté par  (site web personnel) .
Étiquettes : aucune
0
13
déc.
2005
Bonjour,

je tente en vain de lancer une fonction en parralèle de mon interface pygtk.

j'ai une classe dédiée à l'interface, qui contient un bouton

j'ai connecté le bouton à un fonction plop() définit telle que :

def plop(self,widget,data):
scan = Scan(data)
scan.start()

Dans ma fonction scan (qui est donc un Thread) j'ai un appel à os.path.walk

Bref, à chaque clic sur mon bouton, le thread se lance, affiche une ligne, puis se stoppe. Si je reclic, il recommence, et va 1 ligne plus loin. Et ainsi de suite.

J'ai cherché des docs sur les threads en gtk, et j'suis tombé sur des methodes, qui m'ont ammené à modifier mon code un peu hativement de la sorte :

def go(self,widget,data):
gtk.gdk.threads_enter()
scan = Scan(data)
scan.start()
gtk.gdk.threads_leave()

avec dans mon __init__ de ma classe de gui :
gtk.gdk.threads_init()

Mais désormais ca freeze dès que je clique sur mon bouton... :(

Bref, j'suis pas sûr de bien avoir saisi les threads sous gtk, quelqu'un veut il bien m'expliquer ce que j'ai loupé ??

Merci !
  • # Pour résumer

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

    Comme je trouve pas mon problème super clair en me relisant, je la fais courte :

    comment instancier et lancer un objet donc la classe herite de Thread à partir d'un click de bouton gtk, pour le lancer en arrière plan, et le détacher totalement de l'interface (le but d'un thread quoi...)

    (Re) merci.
    • [^] # Re: Pour résumer

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

      Tiens, j'ai viré les appels à threads_enter et threads_leave, et j'ai remonté gtk.gdk.threads_init() juste avant l'instanciation de ma classe Gui, et ca semble marcher... J'vais p'têtre pas chercher à détailler...
      • [^] # Re: Pour résumer

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

        Bon beh finalement il semble qu'au bout d'une trentaine de secondes le thread Scan prend toute les ressources et fige mon interface... Donc ca marche un peu, mais pas totalement :-/
        • [^] # Re: Pour résumer

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

          j'ai ajouté un time.sleep(0.1) à la fin de chaque iteration de mon thread pour laisser respirer le thread gtk. Ca semble fonctionner. Mais n'y a t il pas une fonction moins "constante" que sleep, dans le genre de yield en java ?
          • [^] # Re: Pour résumer

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

            Je crois tenir le bon bout !

            J'ai placé les fonctions gtk.gdk.threads_enter() et gtk.gdk.threads_leave() dans le code de ma fonction run (dans scan),juste avant d'acceder a une variable de ma fenetre gtk (un label que je suis censé mettre a jour à chaque itération), et là ca semble marque, même sans timer.

            Chouette chouette chouette :+)

            Donc je résume, si quelqu'un me lit (pour l'instant j'suis un peu seul), j'aimerai confirmation :

            quand on créé un thread censé modifier une interface GTK (pour updater le texte d'un label par exemple) on doit d'abord :

            1. gtk.gdk.threads_init() avant le gtk.main()
            2. encapsuler le moment du thread où l'on accede à l'interface par les methodes gtk.gdk.threads_enter() et gtk.gdk.threads_leave()

            J'ai bon ?
            • [^] # Re: Pour résumer

              Posté par  . Évalué à 2.

              Pourquoi tu n'utilises pas les thread python ?
              • [^] # Re: Pour résumer

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

                Hem... J'utilise bien évidemment les threads python, mais le problème etait que ces threads ne marchaient pas lorsque je les démarrais depuis une boucle gtk.main()

                'fin bref, problème résolu.
  • # stfw

    Posté par  . Évalué à 2.

Suivre le flux des commentaires

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