Multithread Applikation schließt nicht

Alles rund um die Programmierung mit Qt
Antworten
sooofunky
Beiträge: 31
Registriert: 4. Mai 2011 11:48

Multithread Applikation schließt nicht

Beitrag 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.
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Re: Multithread Applikation schließt nicht

Beitrag von archer »

Ich gehe eher davon aus das du deine Threads nicht beendest!
sooofunky
Beiträge: 31
Registriert: 4. Mai 2011 11:48

Re: Multithread Applikation schließt nicht

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: Multithread Applikation schließt nicht

Beitrag 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..
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Re: Multithread Applikation schließt nicht

Beitrag 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.
sooofunky
Beiträge: 31
Registriert: 4. Mai 2011 11:48

Re: Multithread Applikation schließt nicht

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: Multithread Applikation schließt nicht

Beitrag 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..
sooofunky
Beiträge: 31
Registriert: 4. Mai 2011 11:48

Re: Multithread Applikation schließt nicht

Beitrag 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.
sooofunky
Beiträge: 31
Registriert: 4. Mai 2011 11:48

Re: Multithread Applikation schließt nicht

Beitrag von sooofunky »

Ok, habe jetzt ein wenig gesucht. Sollte also mit QWaitCondition arbeiten.
Antworten