Pygtk + threads_init + windows = Freeze

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

Muss das gtk.gdk.threads_init() vor allen anderen Aufrufen stehen. Also direkt nach dem import?
Es ist nett, freundlich zu sein.
Auch nett: [url=http://www.progchild.de]Homepage[/url]
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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:
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!?
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

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?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Code: Alles auswählen

gobject.threads_init()
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Warum in aller Welt such ich mich seit 2 Stunden ab? Habs wie verrückt mit gtk.gdk.threads probiert.

Vielen Danke
Antworten