Seite 1 von 1

Einfrieren der GUI

Verfasst: 28. Februar 2007 13:09
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

Verfasst: 28. Februar 2007 16:01
von upsala
Friert das Hauptprogramm immer an der gleichen Stelle ein? Friert es auch ein, wenn die anderen Tasks nicht laufen?

Verfasst: 28. Februar 2007 16:36
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

Verfasst: 28. Februar 2007 17:57
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.

Verfasst: 1. März 2007 08:59
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

Verfasst: 1. März 2007 09:02
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.

Verfasst: 1. März 2007 12:22
von upsala
Ich glaube auch nicht, daß man im Call-Stack nichts sehen kann...