Probleme mit QEventloop - Es wird nicht verlassen.
Verfasst: 8. Juli 2008 11:20
Hallo!
Ich will eine berechnung auf mehrere Threads verteilen, aber irgendwie bleibt mein Programm nach der ersten Iteration in der Eventloop hängen.
Gedacht ist es so:
Ich habe eine QCoreApplication (keine GUI, daher gibt es mit QApplication Runtimefehler) die mehrere QThreads startet. Anschließend soll sie warten, bis die Threads fertig sind. Die Threads brauchen eigentlich für Ihre Funktion kein Eventloop, sie rechnen und enden dann. Wenn alle fertig sind soll sich die QCoreApplication beenden. Soweit der Plan, die Realität sieht anders aus.
Ich habe im Header der QCoreApplication-Klasse einen Slot definiert:
Dieser Slot wird im Konstruktor und in der verknüpft:
Später wird dann aus dem Hauptprogramm eine Funktion aufgerufen, die erst die Threads und dann den Eventloop QCoreApplication startet.
Wenn die Threads kein exec() in ihrer run() besitzen kriege ich nach der Berechnung eine "QMutex:
Deadlock detected in Thread <Handlenr.>" Meldung in der oben markierten Zeile. Er hat ein Problem mit der isFinished Abfrage, obwohl ich im Debugger sehen kann, das die interne finished Variable des QObjects des QThreads true ist.
Ich habe das ganze auch mit Eventloops für die Threads ausprobiert:
Er kommt bis zum exec() und hängt dann ohne Meldung im Eventloop. (Der Code ist auskommentiert, da es nicht funktioniert hat.)
Was mache ich falsch?
Ich will eine berechnung auf mehrere Threads verteilen, aber irgendwie bleibt mein Programm nach der ersten Iteration in der Eventloop hängen.
Gedacht ist es so:
Ich habe eine QCoreApplication (keine GUI, daher gibt es mit QApplication Runtimefehler) die mehrere QThreads startet. Anschließend soll sie warten, bis die Threads fertig sind. Die Threads brauchen eigentlich für Ihre Funktion kein Eventloop, sie rechnen und enden dann. Wenn alle fertig sind soll sich die QCoreApplication beenden. Soweit der Plan, die Realität sieht anders aus.
Ich habe im Header der QCoreApplication-Klasse einen Slot definiert:
Code: Alles auswählen
class bewert_verteiler: public QCoreApplication{
Q_OBJECT
protected slots:
void quit_check(){
int warten=0;
for(int lauf =0;lauf<thread_anz;lauf++){
if(thread_handels[lauf]->isFinished()==false){ //hier bleibt er ohne Eventloop der Threads hängen
warten=1;
}
}
if (warten==0){
for (int lauf =0;lauf<thread_anz;lauf++){
thread_handels[lauf]->quit();
}
this->exit();
}
}
public:
...
};
Code: Alles auswählen
connect(thread_handels[lauf],SIGNAL(finished()),this,SLOT(quit_check()),Qt::DirectConnection);
Wenn die Threads kein exec() in ihrer run() besitzen kriege ich nach der Berechnung eine "QMutex:
Ich habe das ganze auch mit Eventloops für die Threads ausprobiert:
Code: Alles auswählen
void sub_bewert_st::run(){
//connect( this, SIGNAL(finished()),this, SLOT(deleteLater()), Qt::QueuedConnection);
bewert_start();
//connect(this,SIGNAL(started()),this,SLOT(quit()),Qt::DirectConnection);
//this->setTerminationEnabled(true);
//connect(this,SIGNAL(started()),this,SLOT(deleteLater()),Qt::QueuedConnection);
//exec();
}
Was mache ich falsch?