Multithread Applikation schließt nicht
Multithread Applikation schließt nicht
Hallo,
habe jetzt 3 QThreads (1 genereller update Thread und 2 für Benutzer Abfragen) für das abarbeiten der Datenbankabfragen. Das funktioniert auch. Nur habe ich jetzt das Problem, dass das Programm beim Schließen zwar nicht mehr sichtbar ist, aber im Hintergrund weiterläuft. Erst durch killen des Prozesses wird es beendet. Nach verschiedenen Tests (habe alles mögliche deaktiviert), gehe ich davon aus, dass ein QTimer, der aus dem Main Thread gestarted wird, daran Schuld sein könnte. Ist das möglich? Ein stop() delete im Deconstructor hat jedenfalls nicht geholfen.
habe jetzt 3 QThreads (1 genereller update Thread und 2 für Benutzer Abfragen) für das abarbeiten der Datenbankabfragen. Das funktioniert auch. Nur habe ich jetzt das Problem, dass das Programm beim Schließen zwar nicht mehr sichtbar ist, aber im Hintergrund weiterläuft. Erst durch killen des Prozesses wird es beendet. Nach verschiedenen Tests (habe alles mögliche deaktiviert), gehe ich davon aus, dass ein QTimer, der aus dem Main Thread gestarted wird, daran Schuld sein könnte. Ist das möglich? Ein stop() delete im Deconstructor hat jedenfalls nicht geholfen.
Re: Multithread Applikation schließt nicht
Ich gehe eher davon aus das du deine Threads nicht beendest!
Re: Multithread Applikation schließt nicht
habe in jedem Thread Deconstructor folgendes:
in run() wird dann der Loop unterbrochen. Wenn ich ein bestimmtes Widget deaktiviere, dann wird die Applikation (jetzt mehrmals getestet, wenn es stimmt) normal beendet. Dieses Widget hat nur einen QTimer der periodisch den Inhalt des Widgets verändert und anzeigt.
Code: Alles auswählen
mutex.lock();
m_abort = true;
mutex.unlock();
wait();
Re: Multithread Applikation schließt nicht
1. ein Debugger hilft.. einfach nach dem vermeindlichen Beenden das Programm im Debugger anhalten und schauen, wo es denn steht...
2. "3 QThreads (1 genereller update Thread und 2 für Benutzer Abfragen)"
In Threads dürfen keine GUI-Operationen durchgeführt werden. Von daher wäre es spannend, was du unter "Benutzer Abfragen" verstehst, denn (Q)Dialoge und ähnliches gehören in den GUI/Main-Thread und nicht in (Q)Threads!
3. "in jedem Thread Deconstructor folgendes:"
Das ist schlechter Stil, weil die Fehlerbehandlung (Return-Werte und Signals aus Destruktor) schwierig wird. Besser ist eine separate Stopp-Methode... so in etwa
4." gehe ich davon aus, dass ein QTimer, der aus dem Main Thread gestarted wird, daran Schuld sein könnte."
Nein.. das ist egal. Wie gesagt: einfach im Debugger mal schauen, welche Threads noch laufen.. oder mit "qDebug()" den Programmfluss beobachten.
hth..
2. "3 QThreads (1 genereller update Thread und 2 für Benutzer Abfragen)"
In Threads dürfen keine GUI-Operationen durchgeführt werden. Von daher wäre es spannend, was du unter "Benutzer Abfragen" verstehst, denn (Q)Dialoge und ähnliches gehören in den GUI/Main-Thread und nicht in (Q)Threads!
3. "in jedem Thread Deconstructor folgendes:"
Das ist schlechter Stil, weil die Fehlerbehandlung (Return-Werte und Signals aus Destruktor) schwierig wird. Besser ist eine separate Stopp-Methode... so in etwa
Code: Alles auswählen
mThread->shutdown(); // allenfalls mit Timeout und Fehlerbehandlung
mThread->deleteLater();
Nein.. das ist egal. Wie gesagt: einfach im Debugger mal schauen, welche Threads noch laufen.. oder mit "qDebug()" den Programmfluss beobachten.
hth..
Re: Multithread Applikation schließt nicht
Evtl. auch mal den Slot von deinem QTimer prüfen.
Nicht das du dir da eine Endlosschleife eingebaut hast, dadurch das deine Threads beendet wurden.
Nicht das du dir da eine Endlosschleife eingebaut hast, dadurch das deine Threads beendet wurden.
Re: Multithread Applikation schließt nicht
Danke für die Antwort. Werde ich gleich probieren.
Die 2 anderen Threads sind ebenfalls für DB Abfragen und Berechnungen zuständig - die Eingaben kommen aber vom Benutzer. GUI Update passiert dort nicht.
Die 2 anderen Threads sind ebenfalls für DB Abfragen und Berechnungen zuständig - die Eingaben kommen aber vom Benutzer. GUI Update passiert dort nicht.
Re: Multithread Applikation schließt nicht
ich habe nicht "keine updates" geschrieben... Da darf absolut überhaupt gar rein nichts hin, was zur GUI gehört. auch keine Abfragen wie z.B. "myLineEdit->text()" und dergleichen. Sämtliche QWidgets darfst du nur im MainThread anrühren. Ich hoffe, dass ist bei dir so...
hth..
hth..
Re: Multithread Applikation schließt nicht
Es werden nur Datenbankabfragen und Berechnungen durchgeführt und per emit an Mainthread übertragen.
Habe das Problem gefunden, leider vergessen, dass der Update Thread ja immer 2min schläft und dadurch nicht gleich beendet wird. Muss ihn also erst aufwecken um zu schliessen.
Habe das Problem gefunden, leider vergessen, dass der Update Thread ja immer 2min schläft und dadurch nicht gleich beendet wird. Muss ihn also erst aufwecken um zu schliessen.
Re: Multithread Applikation schließt nicht
Ok, habe jetzt ein wenig gesucht. Sollte also mit QWaitCondition arbeiten.