QThread non si fermerà / non elabora un segnale
Domanda
Sto cercando di eseguire un po 'di lavoro in un thread separato e fermare quel thread quando il lavoro è finito.
Ho impostato una connessione come questa
thread.connect( workerClass, SIGNAL( finished() ), SLOT( quit() ) );
Ma lo slot Quit () non viene mai chiamato quando emetto il segnale finito (). La riga di comando non mostra alcun avvertimento relativo alle connessioni fallite.
Ho creato un semplice progetto di test per restringere il problema e ho lo stesso comportamento:
Testclass.h:
#ifndef TESTCLASS_H
#define TESTCLASS_H
class TestClass : public QObject
{
Q_OBJECT
public:
TestClass() { }
signals:
void finished();
public slots:
void doWork();
}
#endif // TESTCLASS_H
Testclass.cpp:
#include "TestClass.h"
#include <QtCore/QDebug>
void TestClass::doWork()
{
qDebug() << "Starting";
for( long i = 0; i < 1000000000; i++ );
qDebug() << "Done";
emit finished();
};
e il main.cpp:
#include <QtCore/QCoreApplication>
#include <QtCore/QThread>
#include "TestClass.h"
int main( int argc, char* argv[] )
{
QCoreApplication a( argc, argv );
TestClass testClass;
QThread testThread;
testClass.moveToThread( &testThread );
testThread.connect( &testClass, SIGNAL( finished() ), SLOT( quit() ) );
testClass.connect( &testThread, SIGNAL( started() ), SLOT( doWork() ) );
testThread.start();
testThread.wait();
return 0;
}
Quindi ecco cosa mi aspettavo che accadesse:
- Una volta
testThread.start()
viene elaborato, il threadrun()
la funzione viene chiamata, che chiama internamenteexec()
e inizia un ciclo di eventi. Inoltre lancia unstarted()
segnale. testClass
ha il suodoWork()
slot chiamato.- quando
TestClass::doWork()
è fatto, lancia un filefinished()
segnale. - Il ciclo dell'evento di
testThread
riceve il segnale e lo inoltra al suoquit()
fessura testThread.wait()
ritorna dall'attesa mentre il thread è terminato.
Passaggi 1-3 funzionano e ottengo il qDebug()
produzione. Il problema è al passaggio 4: il segnale viene sparato e inoltrato ad un ciclo di eventi (l'ho debug un po ', ma non sono riuscito a capire quale ciclo di eventi è stato licenziato) ma il quit()
Lo slot non viene mai chiamato.
Che cosa sto facendo di sbagliato?
PS: Per favore, non suggerire invece la sottoclasse QThread, l'intero punto di me che provo questa via d'uscita è perché voglio evitare la sottoclasse QThread.
Nessuna soluzione corretta