Seite 1 von 1

Probleme mit Threads und GTK

Verfasst: Samstag 2. Juni 2007, 03:30
von pete123
Hi,

ich wollte gerade in meiner GTK-Anwendung ein Label alle 10 Sekunden mit einem neuen Wert belegen, also habe ich mir gedacht da sind Threads genau das richtige - aber irgendwas mache ich wohl falsch :/

Ich habe mein Beispiel jetzt so runter gekürzt, dass das Label gar nicht mehr beachtet wird, lediglich ein einfaches Print soll jede Sekunde passieren, aber solange die GUI läuft funktioniert das leider nicht.


Hier mein Code:

Code: Alles auswählen

from math import *
from time import *
import pygtk
from threading import *
pygtk.require("2.0")
import gtk
import gtk.glade


class Temp (Thread):
  def __init__(self):
    Thread.__init__(self)
    self.test=1
    self.gladefile = "temptest.glade"
    self.wTree = gtk.glade.XML(self.gladefile) 
    self.window = self.wTree.get_widget("window1")
    
    if (self.window):
      self.window.connect("destroy", self.qquit) 
       
    dic = {"on_start_clicked" : self.start_threaded}
    self.wTree.signal_autoconnect(dic)

  def qquit(self,widget):
    print "GUI-Quit"
    self.test=0;
    gtk.main_quit(widget)

  def start_threaded(self,widget=None):
    print "thread"
    self.start()
  
  def run(self,widget=None):
    while (1):
      print "hi"
      sleep(1)

if __name__ == "__main__":
  temptest = Temp()
  gtk.main()
und hier die Ausgabe:
python temperaturmessung_mit_ttf103.py
thread
hi
GUI-Quit
hi
hi
hi
hi
hi
hi
hi
Beendet

Nach der ersten Ausgabe von Hi bleibt der Thread quasi stehen, bis ich eben die gui beende, dann läuft er solange weiter bis ich ihn per kill abschieße (beendet)


--> Wo liegt mein Denk-/ bzw. Anwendungsfehler?

Vielen Dank schonmal für eure Hilfe,
Pete

Re: Probleme mit Threads und GTK

Verfasst: Samstag 2. Juni 2007, 12:21
von veers
pete123 hat geschrieben:Hi,

ich wollte gerade in meiner GTK-Anwendung ein Label alle 10 Sekunden mit einem neuen Wert belegen, also habe ich mir gedacht da sind Threads genau das richtige - aber irgendwas mache ich wohl falsch :/
Man sollte sich Multithreading nicht unnötig antun ;)
http://www.pygtk.org/docs/pygobject/gob ... tions.html
>> gobject.timeout_add ;)

Gruss,
Jonas

Verfasst: Samstag 2. Juni 2007, 15:12
von pete123
hmm,
ja so funktioniert es :)

Aber mich würde es trotzdem interessieren warum das oben nicht funktioniert hat, vielleicht braucht man ja irgendwann doch mal echte Threads :)

Danke!
Pete

Verfasst: Samstag 2. Juni 2007, 17:31
von veers
Naja das mit dem Zugriff aus mehreren Threads ist nicht ganz so leicht. Ich würde es wie gesagt nach Möglichkeit vermeiden. Zum Beispiel in dem du aus dem zweiten Thread ein Callback der Event Queue des Mainloops hinzufügst. Aber was war ja nicht deine eigentliche frage ;)

Deine Frage wird von den pygtk FAQ beantwortet.,

Verfasst: Sonntag 3. Juni 2007, 11:04
von Leonidas
GTK + Threads gehen wie in dem Snippet beschrieben. Aber in der Regel *will* man keine Threads verwenden.