Einfrieren der GUI

Alles rund um die Programmierung mit Qt
Antworten
Isa
Beiträge: 32
Registriert: 10. April 2006 13:18

Einfrieren der GUI

Beitrag von Isa »

Hallo,

ich habe das Problem, dass meine GUI nach einiger Laufzeit immer einfriert und sich nichts mehr klicken oder öffnen lässt, da hilft dann nur noch der Taskmanager. Meine GUI läuft natürlich im Hauptthread und in einigen Nebenthreads werden die Klassen ausgeführt, die meine GUI mit Daten versorgen (ist ziemlich groß). Jetzt ist es so, dass die Prozesse im Hintergrund alle weiterlaufen und offensichtlich funktionieren, die GUI aber nicht mehr upgedatet wird und irgendwann ganz abstürzt. Es gibt aber keine Exceptions, sondern es läuft einfach nicht mehr. Man kann auch nicht sagen, dass das immer zu einer bestimmten Zeit passiert oder unter bestimmten Umständen, manchmal läuft alles auch ganz normal. Ich benutze in meiner Applikation auch Events sowohl von Qt als auch eine eigene Eventklasse für die Hintergrundprozesse. Im Qt Assistent habe ich gelesen, dass das zusammen mit Threads evt. zum Einfrieren führen kann, habe aber nicht genau verstanden warum. Kann mir da jemand weiterhelfen? Übrigens ich benutze Qt 4.2.2. Danke für eure Hilfe, ich hoffe, ich hab mich einigermaßen verständlich ausgedrückt.

Grüße,
Isa
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Friert das Hauptprogramm immer an der gleichen Stelle ein? Friert es auch ein, wenn die anderen Tasks nicht laufen?
Isa
Beiträge: 32
Registriert: 10. April 2006 13:18

Beitrag von Isa »

Hallo Upsala
Nein, es friert zu völlig unterschiedlichen Zeitpunkten ein. Wenn die anderen Tasks nicht laufen wird die GUI nicht upgedatet und das Fenster bleibt einfach leer, also da passiert einfach dann nichts.
Ich hab mich vorhin glaube ich nicht so gut ausgedrückt, was die Abläufe anbelangt, ich versuch es nochmal:
Also, die GUI wird in main gestartet. Dann erscheint ein MainWindow. Im Konstruktor von dem MainWindow wird eine Klasse BackThread, die von QThread erbt, initialisiert und der Thread per start() gestartet. In run() wird dann einfach exec() aufgerufen. Wenn man jetzt auf eine QAction im Mainframe klickt, fängt der Thread an die Klassen im Hintergrund zu initialisieren und deren Daten zu sammeln. Nach dem Ablauf eines QTimers (im BackThread), werden die Daten per Event an die Widgets im MainWindow verschickt und dort entsprechend angezeigt. Der QTimer wird wieder gestartet und das ganze geht von vorne los...
Und irgendwann, das kann nach 5 oder 10 oder mehr Minuten sein, will man im MainWindow irgendwas klicken und das ganze friert ein und es tut sich nichts mehr, während im Hintergrund aber noch fleißig Daten erzeugt werden.
Mir ist noch etwas aufgefallen, ich habe das MainWindow und den BackThread leider nicht alleine gemacht, aber mir ist bei der initialisierung von BackThread aufgefallen, dass BackThread->moveToThread(BackThread) aufgerufen wird. Ich weiß, was diese Methode macht, aber mir kommt das komisch vor.

Puuuh, das ist ein langer Text, ich hoffe, es hat überhaupt jemand Zeit den zu lesen. Danke für eure Hilfe,

Isa
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Entweder der Hauptthread wird mit signals von den anderen Threads zugemüllt oder er steckt selbst in einer Berechnung.
Einfach mal debuggen und wenn das Programm einfriert schauen wo er gerade ist.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Isa
Beiträge: 32
Registriert: 10. April 2006 13:18

Beitrag von Isa »

Na, ja, das der Hauptthread zugemüllt wird, glaube ich eigentlich nicht. Da die widgets ihre Daten ja durch events bekommen und alle im Hauptthread laufen, gibt es sonst eigentlich nicht viele signal-slots-Verbindungen zum Hauptthread. Und der Backendthread erhält nur Signale vom MainWindow und dann auch nur zum Stoppen oder Starten. Beim Debuggen habe ich halt das Problem, dass ich ja nie weiß, wann meine Applikation stoppen wird und dadurch, dass die widgets alle 10 sec upgedatet werden, wird das ganze auch nicht gerade erleichtert. Gibt es nicht irgendeine Möglichkeit festzustellen an welchem Punkt mein Programm stoppt ohne Breakpoints zu setzen? Im Call Stack kann man nichts sehen und das Fenster mit den Threads hilft mir auch nicht gerade weiter.
Jemand eine Idee? Grüße,
Isa
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich glaube da wäre mal ein Grundkurs im Debuggen nötig.
Man kann (egal mit wlechen Debugger) das Programm zu jeder Zeit einfach unterbrechen. Breakpoints sind dafür eindeutig nicht nötig.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich glaube auch nicht, daß man im Call-Stack nichts sehen kann...
Antworten