我写了一个执行worker对象的线程。一切正常。所产生的信号也应该发射出去。当然,我关心线程/对象亲和力方面的常见错误。QSignalSpy不能与线程一起使用
今天我为这些工人/线程写了一个自动模块测试。我创建了一个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中这样编程?这是一个错误还是它的打算行为?我该如何解决这个限制?
我阅读了链接。特别是有趣的ML讨论。我不确定我是否完全理解了这些原因,为什么他们决定在QTestEventLoop方面解决问题,而不是在QSignalSpy连接端。两种解决方案都能解决问题,不是吗? – Silicomancer 2014-12-06 21:58:21
因为维护者喜欢这种方式。 – lpapp 2014-12-07 00:56:11