Qt的GUI线程在从外部对象调用方法时是否会在引擎盖下生成线程?
does qt's gui thread spawn threads under the hood when calling methods from outside objects?
我最近在C 中开发基于QT的应用程序时遇到了线程/内存问题,我正在寻找正确的解释。我真的不能发布一个功能齐全的示例,因为这需要链接到QT等。但是,问题在几行中很清楚地解释了。
当我单击GUI上的按钮时,发生了类似的事情:
void MainWindow::onClick(){
std::vector<int> vec;
vec.push_back(0);
dev.connect(vec);
// do some more stuff
}
在这种情况下,dev
是MainWindow
的成员,是类型Device
的成员,它代表我要连接的硬件(或更准确,更准确的硬件驱动程序)。connect
的代码类似:
void Device::connect(const std::vector<int>& vec){
// do some stuff with vec that takes a long time
}
我遇到的问题是设备驱动程序使我异常,因为它们从vec
中获得了不良值。实际上,当我闯入connect
时,数据消失了:在该范围中,vec
是空的内存。我使用shared_ptr
s。
我的理论是,当我从GUI线程调用dev.connect(vec)
时,QT实际上将其调用在单独的线程上。然后,该功能需要很长时间,并且QT决定该继续进行并完成onClick
(或类似的东西,也许立即发生),以便到vec
在Device::connect
中处理时,它已经超出了范围。鉴于shared_ptr
在这里保存一天的事实。
所以我的问题是,我对此做对吗?有人可以解释QT隐式螺纹行为的细节,还是指出某些解释?
您要问的是,QT UI线程是否有可能在某些任务中需要这么长时间,以至于它被中断,从函数返回,然后尝试从它停止的地方。
答案是否定的。如果线程中断,则它将返回到它的位置,或者即将终止。试图进行否则可能会被病毒扫描仪标记。引入讨厌的虫子。
如果您尝试执行在UI线程中需要很长时间的事情,那么可能会发生的是您的UI变得无响应,并且OS会抱怨应用程序已经无响应(因为应用程序不再能够对操作系统发送给它的事件的反应)
更有可能是在QT中提出信号时,不能保证它会立即传递给插槽,因此您最终会在所描述的情况下。
shared_ptr"保存一天"的事实意味着您并不是在看着正在破坏堆栈的情况(好事,很难调试);一个简单的堆栈跟踪应该回答您的问题。
加上一个对ukmonkey的一个,因为答案确实是'否'。感谢您的详细信息。
进一步调查,我发现实际上还有另一个问题是设备驾驶员投诉的核心。我认为这是向量的东西,因为(在这种特殊情况下)可以想象的空矢量可能是异常和的根源,调试器显示了它是空的。使用 shard_ptr
s,我在向量中看到了值,但仍然有例外。然后,我找到了例外的(无关和真实的)原因并将其修复。返回到nonshared_ptr版本(但是,如果不相关的异常施加错误),则代码按预期运行。
所以,这只是一个红鲱鱼。但是,我很高兴我知道答案是事实"不"。QT在处理这样的直截了当的情况时,没有任何有趣的业务。我展示的代码确实确实阻止了connect
的呼叫。
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- 如何从另一个线程调用颤振引擎方法
- 将游戏服务器线程循环限制为 30FPS,而无需游戏引擎/渲染窗口
- 使用 Matlab 引擎的多线程C++应用程序
- 通过C++从后台线程错误修改自动布局引擎
- Google V8引擎可以在不同的上下文、不同的线程中同时运行不同的javascript吗?
- 从运行QML QtQuick2引擎的不同线程更新c++模型的行为
- 通过线程实现游戏引擎决定论
- 从多个线程访问随机数引擎
- Matlab引擎API的线程安全性