Я пытаюсь выполнить некоторую работу в отдельном потоке и остановить этот поток, когда работа будет выполнена.
Я установил такое соединение
thread.connect( workerClass, SIGNAL( finished() ), SLOT( quit() ) );
но слот quit() никогда не вызывается, когда я испускаю сигнал finish(). В командной строке не отображаются предупреждения, связанные с неудачными подключениями.
Я создал простой тестовый проект, чтобы сузить проблему, и я получаю такое же поведение:
ТестКласс.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
ТестКласс.cpp:
#include "TestClass.h"
#include <QtCore/QDebug>
void TestClass::doWork()
{
qDebug() << "Starting";
for( long i = 0; i < 1000000000; i++ );
qDebug() << "Done";
emit finished();
};
и 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;
}
Итак, вот что я ожидал:
- После обработки
testThread.start()
вызывается функцияrun()
потока, которая внутренне вызываетexec()
и запускает цикл обработки событий. Кроме того, он выдает сигналstarted()
. testClass
вызываетсяdoWork()
слот.- Когда
TestClass::doWork()
выполнено, выдается сигналfinished()
. - Цикл событий
testThread
получает сигнал и перенаправляет его в свой слотquit()
. testThread.wait()
возвращается из ожидания, так как поток завершен.
Шаги 1-3 работают, и я получаю вывод qDebug()
. Проблема на шаге 4: сигнал запускается и перенаправляется в какой-то цикл событий (я немного отладил его, но не смог понять, в какой цикл событий он был запущен), но слот quit()
никогда не вызывается.
Что я делаю неправильно?
PS: Пожалуйста, не предлагайте вместо этого создавать подклассы QThread, весь смысл того, что я пытаюсь сделать это, заключается в том, что я хочу избежать создания подклассов QThread.