gpt4 book ai didi

c++ - QSignalSpy 不能与线程一起使用

转载 作者:太空狗 更新时间:2023-10-29 20:58:35 25 4
gpt4 key购买 nike

我写了一个执行工作对象的线程。一切正常。生成的信号也会按应有的方式发出。当然,我处理了有关线程/对象亲和性的常见错误。

今天我为这些工作线程/线程编写了一个自动化模块测试。我创建了一个 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 中以这种方式编程?这是一个错误还是故意的行为?我该如何解决这个限制?

最佳答案

不幸的是,这是一个长期存在的问题,公平地说超过六年:

QSignalSpy crashes if signal is emitted from worker thread

我几年前在 Qt 贡献者峰会上认识了 Jason,但在那之后不久他就离开了诺基亚,因为诺基亚关闭了他工作的布里斯类办事处。遗憾的是,在那之后,Qt 的这个测试模块没有太多贡献。

最近在邮件列表上也有更多关于它的讨论:

Why is QSignalSpy using Qt::DirectConnection?

Roland 提出的解决方案是这样的,维护者 Thiago 也接受了:

if (thread() != QThread::currentThread())
{
QMetaObject::invokeMethod(this, "exitLoop", Qt::QueuedConnection);
return;
}

5.4之前没进去真的有点遗憾。话虽如此,随着更改的合并,这将在 Qt 5.4 中得到修复:

Make QTestEventLoop::exitLoop() thread-safe

关于c++ - QSignalSpy 不能与线程一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27336400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com