Qt的GUI线程在从外部对象调用方法时是否会在引擎盖下生成线程?

does qt's gui thread spawn threads under the hood when calling methods from outside objects?

本文关键字:线程 引擎 是否 方法 GUI 从外部 对象 Qt 调用      更新时间:2023-10-16

我最近在C 中开发基于QT的应用程序时遇到了线程/内存问题,我正在寻找正确的解释。我真的不能发布一个功能齐全的示例,因为这需要链接到QT等。但是,问题在几行中很清楚地解释了。

当我单击GUI上的按钮时,发生了类似的事情:

void MainWindow::onClick(){
    std::vector<int> vec;
    vec.push_back(0);
    dev.connect(vec);
    // do some more stuff
}

在这种情况下,devMainWindow的成员,是类型Device的成员,它代表我要连接的硬件(或更准确,更准确的硬件驱动程序)。connect的代码类似:

void Device::connect(const std::vector<int>& vec){
    // do some stuff with vec that takes a long time
}

我遇到的问题是设备驱动程序使我异常,因为它们从vec中获得了不良值。实际上,当我闯入connect时,数据消失了:在该范围中,vec是空的内存。我使用shared_ptrs。

解决了问题

我的理论是,当我从GUI线程调用dev.connect(vec)时,QT实际上将其调用在单独的线程上。然后,该功能需要很长时间,并且QT决定该继续进行并完成onClick(或类似的东西,也许立即发生),以便到vecDevice::connect中处理时,它已经超出了范围。鉴于shared_ptr在这里保存一天的事实。

所以我的问题是,我对此做对吗?有人可以解释QT隐式螺纹行为的细节,还是指出某些解释?

您要问的是,QT UI线程是否有可能在某些任务中需要这么长时间,以至于它被中断,从函数返回,然后尝试从它停止的地方。

答案是否定的。如果线程中断,则它将返回到它的位置,或者即将终止。试图进行否则可能会被病毒扫描仪标记。引入讨厌的虫子。

如果您尝试执行在UI线程中需要很长时间的事情,那么可能会发生的是您的UI变得无响应,并且OS会抱怨应用程序已经无响应(因为应用程序不再能够对操作系统发送给它的事件的反应)

更有可能是在QT中提出信号时,不能保证它会立即传递给插槽,因此您最终会在所描述的情况下。

shared_ptr"保存一天"的事实意味着您并不是在看着正在破坏堆栈的情况(好事,很难调试);一个简单的堆栈跟踪应该回答您的问题。

加上一个对ukmonkey的一个,因为答案确实是'否'。感谢您的详细信息。

进一步调查,我发现实际上还有另一个问题是设备驾驶员投诉的核心。我认为这是向量的东西,因为(在这种特殊情况下)可以想象的空矢量可能是异常的根源,调试器显示了它是空的。使用 shard_ptr s,我在向量中看到了值,但仍然有例外。然后,我找到了例外的(无关和真实的)原因并将其修复。返回到nonshared_ptr版本(但是,如果不相关的异常施加错误),则代码按预期运行。

所以,这只是一个红鲱鱼。但是,我很高兴我知道答案是事实"不"。QT在处理这样的直截了当的情况时,没有任何有趣的业务。我展示的代码确实确实阻止了connect的呼叫。