Funktion beim Start ausführen und Systemsignale registrieren

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Benutzeravatar
Bachsau
User
Beiträge: 7
Registriert: Sonntag 6. April 2014, 18:34

Hallo, ich bin noch recht neu bei Python und GTK.

Mein Problem ist, dass ich mein Programm dazu bringen möchte, direkt nach dem Start des GTK-Main-Loop mit der Arbeit anzufangen (eine Datei zu entschlüsseln) während es einen Statusbalken zeigt. Also bevor der Benutzer irgendetwas gedrückt hat. Außerdem möchte ich, dass das Programm auf Systemsignale (SIGINT, SIGTERM) reagiert, und zwar möglichst umgehend. Momentan geht nichts davon, weil mir der Main-Loop das ganze Programm blockiert. Während ein Befehl aus dem GUI ausgeführt wird, friert deshalb auch die ganze Oberfläche fest, an Statusleisten ist da nicht zu denken.

Meine erste Idee: Den Main-Loop in einem Unterthread starten. Funktioniert auch soweit, dass ich nebenher was anderes tun, und auf Systemsignale reagieren kann, bringt aber andere Probleme mit sich. Deshalb meine Frage: Gibt es irgendwo in diesem Gtk/Gobject/Gdk-Monster eine möglichkeit, Callbacks für Systemsignale zu registrieren, Funktionen direkt nach Aufbau des ersten Fensters aufzurufen, und die GUI während der Abarbeitung zu aktualisieren, so dass ich das wieder in den Hauptthread packen kann?

Würde 'ne Menge Komplexität sparen. :K
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Bachsau: wenn Du neben der GUI auch noch Berechnungen laufen lassen willst, kommst Du um Threads nicht herum, wobei Du aufpassen mußt, dass nur der Hauptthread die GUI verändert: GUIs sind in der Regel nicht darauf ausgelegt, dass mehrere Threads gleichzeitig darauf zugreifen. Signale kommen dagegen immer völlig unerwartet und es ist nicht klar, in welchem Thread sie landen. Daher kannst Du im Signal-Handler nur Dinge tun, die wiederum Threadsicher sind, also z.B. ein Event in eine Queue stecken. Die Abarbeitung dieses Events muß dann an einer definierten Stelle passieren.
Benutzeravatar
Bachsau
User
Beiträge: 7
Registriert: Sonntag 6. April 2014, 18:34

Sirius3 hat geschrieben:wobei Du aufpassen mußt, dass nur der Hauptthread die GUI verändert: GUIs sind in der Regel nicht darauf ausgelegt, dass mehrere Threads gleichzeitig darauf zugreifen.
Ich bin dabei nach dieser Anleitung hier vorgegangen. Dort werden sowohl direkte Zugriffsmöglichkeiten, wie auch die Queue-Funktion erklärt:
http://faq.pygtk.org/index.py?req=show& ... 20.006.htp
Sirius3 hat geschrieben:Signale kommen dagegen immer völlig unerwartet und es ist nicht klar, in welchem Thread sie landen.
Laut Python-Dokumentation landen sie IMMER im Haupt-Thread, und das scheint auch zu stimmen. Deshalb werden sie auch nicht bearbeitet, solange der GTK-Loop dort schläft. Deshalb starte ich den GTK-Loop jetzt selbst in einem anderen Thread, dann kann er den verstopfen. Ich hatte gehofft es gäbe es eine elegantere Lösung, aber scheinbar nicht, oder? Dann muss ich den Haupt-Thread ständig verfügbar halten.

Wie sieht es mit den Start-Befehlen aus? Das Ubuntu-Software-Center reagiert zwar auch nicht angemessen auf Signale, aber immerhin initialisiert es sich nach dem Laden der GUI von selbst. Und hier läuft der Main-Loop definitiv im Haupt-Thread.
Antworten