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!
Thereads beenden nach Programmende
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...
Qt Version: 4.7
IDE: Eclipse 4.3 Helios
Ubuntu 10.04-
Friend to Friend Network: http://code.google.com/p/ftofsharing/
IDE: Eclipse 4.3 Helios
Ubuntu 10.04-
Friend to Friend Network: http://code.google.com/p/ftofsharing/
@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..
@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..
Weisst aber schon draufhin, das die Threads ne eigene Loop haben (sollten).zu bearbeitende Tasks durch Signal/Slots-Verbindungen zuweise.
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
Ciao ...