Thereads beenden nach Programmende

Alles rund um die Programmierung mit Qt
Antworten
Joshy
Beiträge: 1
Registriert: 20. Oktober 2010 19:16

Thereads beenden nach Programmende

Beitrag 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!
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Naja, ohne den Code deiner Threads zu kennen, kann man wohl kaum sagen, warum sich selbige nicht beenden.
muma
Beiträge: 3
Registriert: 21. Oktober 2010 12:50

Beitrag 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...
Qt Version: 4.7
IDE: Eclipse 4.3 Helios
Ubuntu 10.04-
Friend to Friend Network: http://code.google.com/p/ftofsharing/
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Und in den Threads läuft eine Event-Loop?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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..
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

solarix hat geschrieben:@upsala: warum sollte da keine laufen...?
Naja, wenn man keine braucht, und dementsprechend keine startet, läuft auch keine...
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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...
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Antworten