Seite 1 von 1

Pygtk + threads_init + windows = Freeze

Verfasst: Dienstag 24. Juli 2007, 23:48
von veers
Ich habe derzeit ein Problem mit pygtk unter Windows und zwar friert pygtk jeweils in gtk.main ein wenn threads_init aufgerufen wurde.
Minimalbeispiel:

Code: Alles auswählen

import gtk
w = gtk.Window()
w.show()
gtk.gdk.threads_init()
gtk.main()
Bei Google finde ich nur Bruchstücke von Informationen dazu.

Ist das Problem und vielleicht auch eine Lösung jemandem bekannt?
Ich möchte nicht den gesamten Code so umschreiben das er idle_add verwendet!

Edit:
Habe nun etwas gefunden:
http://faq.pygtk.org/index.py?req=show& ... 21.003.htp

Verfasst: Donnerstag 2. August 2007, 23:22
von ProgChild
Muss das gtk.gdk.threads_init() vor allen anderen Aufrufen stehen. Also direkt nach dem import?

Verfasst: Montag 6. August 2007, 13:18
von veers
Zitat Dokumentation:
"The gtk.gdk.threads_init() function must be called before the gtk.main()
function."

Zum eigentlichen Problem, meine schlussfolgerung ist: Threading + PyGTK + Windows == Sehr kaputt! :roll:

Verfasst: Montag 6. August 2007, 15:25
von BlackJack
Vielleicht liegt's auch an Dir. Du hast keinen Quelltext gezeigt, aber Du weisst, dass man auf GUI-Toolkits im Allgemeinen nicht von mehreren Threads aus zugreifen kann!?

Verfasst: Montag 6. August 2007, 16:06
von veers
BlackJack hat geschrieben:Vielleicht liegt's auch an Dir. Du hast keinen Quelltext gezeigt, aber Du weisst, dass man auf GUI-Toolkits im Allgemeinen nicht von mehreren Threads aus zugreifen kann!?
Ja, weiss ich. Aber es muss möglich sein in einem Thread etwas ganz anderes laufen zu lassen (zum Beispiel einen Webserver, der nicht auf das GUI zugreift). Wenn ich dazu dann einen Hack wie:

Code: Alles auswählen

    if sys.platform == "win32":
        def release_gil_on_stupid_operating_system():
            time.sleep(0.001)
            return True
        gobject.idle_add(release_gil_on_stupid_operating_system)
brauche denke ich das ist kaputt ;)

Ohne diesen hack war das verhalten so das die anderen Threads nur ausgeführt wurden wenn gtk "Aufgeweckt wurde". Sprich man musste wie wild im GUI rumklicken damit eine Datei ausgeliefert wird. Unter Vista scheint der obige hack nicht zu tun.

Verfasst: Donnerstag 9. August 2007, 11:38
von Leonidas
veers hat geschrieben:Zum eigentlichen Problem, meine schlussfolgerung ist: Threading + PyGTK + Windows == Sehr kaputt! :roll:
Damit deckt sich deine Schlussfolgerung mit der der GTK+ Entwickler,die auch gemerkt haben, dass das was GTK+ mit Threads macht, sich mit Windows nicht gut verträgt.

Verfasst: Samstag 18. April 2009, 13:39
von gugugs
Tut mir leid, das ich ein Thema von 2007 noch einmal aufgreifen muss. Aber ich hab da noch nicht so wirklich eine Lösung gefunden, beziehungsweise den Hack habe ich nicht so verstanden, besonders nicht, wo der hingehört... Kann mir vllt jemand noch einmal ein wenig unter die Arme greifen? Oder gibt es vllt eine Alternative?

Verfasst: Samstag 18. April 2009, 14:13
von ms4py

Code: Alles auswählen

gobject.threads_init()

Verfasst: Samstag 18. April 2009, 14:45
von gugugs
Warum in aller Welt such ich mich seit 2 Stunden ab? Habs wie verrückt mit gtk.gdk.threads probiert.

Vielen Danke