Seite 1 von 1

Thereads beenden nach Programmende

Verfasst: 21. Oktober 2010 10:14
von Joshy
Hallo,

ich habe eine Problem, dass die Beendigung von Threads betrifft. Meine Threadsstrategie ist, dass ich Objekte von Klassen mit "moveToThread" Threads zugewissen habe, die ich nachdem ich die Threads mit "start()" gestartet habe, zu bearbeitende Tasks durch Signal/Slots-Verbindungen zuweise.
In meinem Programm sieht das ungefähr so aus:
m_pThread1 = new QThread();
m_pThread2 = new QThread();
//Object wird Thread zugewiesen
m_pObject1->moveToThread(m_pThread1);
m_pObject2->moveToThread(m_pThread2);
//start des Threads
m_pThread1->start();
m_pThread2->start();

//connection
connect(m_pObject1, SIGNAL(started()), m_pObject2, SLOT(initialize()));

Nun zu meinem Problem. Wenn der x-Knopf meines GUI-Fenster geklickt wird, dann wird die von mir geschriebene closeEven Funktion aufgerufen um zuerst meine Threads zu beenden und mit even->accept mein Programm zu schließen. Das Programmschnippsel sieht wie folgt aus:

void MainWindow::closeEvent(QCloseEvent *event)
{
//Disconnecting connection
m_pObject1->disconnect();

//Beendigung Threads
m_pThread1->quit();
m_pThread2->quit();

m_pThread1->wait();
m_pThread2->wait();

event->accept();
}

Wenn ich nun den X-Knopf betätige, dann bleibt ab und zu das Programm in einer der m_pThread1/2->wait() hängen. Einer der Threads wird nicht beendet obwohl ich alle connect-Verbindungen disconnected habe und somit sichergestellt ist, dass keine neuen Task übergeben werden. Wie kann ich sicherstellen, dass alle meine Threads beendet wurde nachdem ich das Programm geschlossen habe?

Vielen Dank für eure Hilfe!

Verfasst: 21. Oktober 2010 10:16
von pfid
Naja, ohne den Code deiner Threads zu kennen, kann man wohl kaum sagen, warum sich selbige nicht beenden.

Verfasst: 21. Oktober 2010 17:57
von muma
Eine fesche Lösung wäre das Abfangen von Quit in den Threads (das heißt regelmäßiges Pollen!), und dann einfach auf ein Return zu springen...

Verfasst: 21. Oktober 2010 19:03
von upsala
Und in den Threads läuft eine Event-Loop?

Verfasst: 21. Oktober 2010 22:24
von solarix
@upsala: warum sollte da keine laufen...?

@muma: ich hab den Verdacht dass du das Prinzip einer Eventloop nicht verstanden hast..

@Joshy: offenbar arbeitet noch irgend ein Slot von m_pObject[1/2] im Kontext des Threads.. Entweder du zeigst uns den Slot-Code oder du hälst im Debugger dein Programm einfach an und schaust, wo genau der Thread steht..

hth..

Verfasst: 22. Oktober 2010 08:30
von pfid
solarix hat geschrieben:@upsala: warum sollte da keine laufen...?
Naja, wenn man keine braucht, und dementsprechend keine startet, läuft auch keine...

Verfasst: 22. Oktober 2010 09:16
von solarix
In der Default-Implementierung der run-Methode von QThread hat es aber eine Eventloop... seit Qt4.4 jedenfalls.. und vorher war die Klasse abstrakt und konnte damit gar nicht erzeugt werden...

Verfasst: 22. Oktober 2010 09:17
von RHBaum
zu bearbeitende Tasks durch Signal/Slots-Verbindungen zuweise.
Weisst aber schon draufhin, das die Threads ne eigene Loop haben (sollten).
Ob des denn wirklich so funktioniert, wie der TE will, da kann nur der Quellcode Licht ins Dunkel bringen :-)
Schliesslich, die beste eventloop hilft nix, wenn da drinne eine nicht rueckehrende funktion angesprungen wird :twisted:

Ciao ...