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
Einfrieren der GUI
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
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:
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
Jemand eine Idee? Grüße,
Isa
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten: