我写了一个执行工作对象的线程。一切都运行良好。信号也按照应该的方式被发射出来。当然,我注意到了与线程/对象亲和性有关的常见错误。
今天,我为这些工人/线程编写了自动化模块测试。我创建了一个QSignalSpy来等待由工人对象(已移至线程)发出的信号,如下所示:
这显然意味着 QSignalSpy 总是使用 DirectConnection,无法用于监视生存在不同线程中的对象的信号。
为什么在Qt5.3中会这样编程?这是一个错误还是故意的行为?如何解决这个限制?
今天,我为这些工人/线程编写了自动化模块测试。我创建了一个QSignalSpy来等待由工人对象(已移至线程)发出的信号,如下所示:
QSignalSpy spy(worker, SIGNAL(Success()));
thread.ExecuteWorker();
QVERIFY(spy.wait()); // Error in this line
我在标记的行中遇到了一个众所周知的错误:
QObject::killTimer: timers cannot be stopped from another thread
起初我以为是自己的错误,因为wait()函数中的代码在错误的线程中被执行。后来我在QSignalSpy的实现代码中发现了下面这段:
if (!QMetaObject::connect(obj, sigIndex, this, memberOffset, Qt::DirectConnection, 0))
{
qWarning("QSignalSpy: QMetaObject::connect returned false. Unable to connect.");
return;
}
这显然意味着 QSignalSpy 总是使用 DirectConnection,无法用于监视生存在不同线程中的对象的信号。
为什么在Qt5.3中会这样编程?这是一个错误还是故意的行为?如何解决这个限制?