Seite 1 von 1

Multithread Applikation schließt nicht

Verfasst: 25. Juli 2011 11:18
von sooofunky
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.

Re: Multithread Applikation schließt nicht

Verfasst: 25. Juli 2011 12:00
von archer
Ich gehe eher davon aus das du deine Threads nicht beendest!

Re: Multithread Applikation schließt nicht

Verfasst: 25. Juli 2011 12:45
von sooofunky
habe in jedem Thread Deconstructor folgendes:

Code: Alles auswählen

mutex.lock();
m_abort = true;
mutex.unlock();
wait();
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.

Re: Multithread Applikation schließt nicht

Verfasst: 25. Juli 2011 13:14
von solarix
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

Code: Alles auswählen

 mThread->shutdown(); //  allenfalls mit Timeout und Fehlerbehandlung
 mThread->deleteLater();
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..

Re: Multithread Applikation schließt nicht

Verfasst: 25. Juli 2011 13:23
von archer
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.

Re: Multithread Applikation schließt nicht

Verfasst: 25. Juli 2011 13:25
von sooofunky
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.

Re: Multithread Applikation schließt nicht

Verfasst: 25. Juli 2011 13:34
von solarix
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..

Re: Multithread Applikation schließt nicht

Verfasst: 25. Juli 2011 13:54
von sooofunky
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.

Re: Multithread Applikation schließt nicht

Verfasst: 25. Juli 2011 14:11
von sooofunky
Ok, habe jetzt ein wenig gesucht. Sollte also mit QWaitCondition arbeiten.