Я пытаюсь выполнить некоторую работу в отдельном потоке и остановить этот поток, когда работа будет завершена.
Я установил соединение вот так
thread.connect( workerClass, SIGNAL( finished() ), SLOT( quit() ) );
но слот quit () никогда не вызывается, когда я посылаю сигнал Finished (). Командная строка не показывает никаких предупреждений, связанных с ошибочными соединениями.
Я создал простой тестовый проект, чтобы сузить проблему, и у меня такое же поведение:
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();
};
и 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()
никогда не вызывается.
Что я делаю не так?
P.S .: Пожалуйста, не предлагайте вместо этого создавать подклассы QThread, весь смысл того, что я пробую этот выход, заключается в том, что я хочу избежать создания подклассов QThread.