Thereads beenden nach Programmende
Verfasst: 21. Oktober 2010 10:14
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!
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!