我正在尝试在一个单独的线程中执行一些工作,并在工作完成后停止该线程。
我已经建立了这样的连接
thread.connect( workerClass, SIGNAL( finished() ), SLOT( quit() ) );
但是当我发出 finished() 信号时,永远不会调用 quit() 插槽。命令行不显示与失败连接相关的任何警告。
我创建了一个简单的测试项目来缩小问题范围,并且得到了相同的行为:
测试类.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。