c – 当从外部对象调用方法时,qt的gui线程产生线程吗?
最近我在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,它表示我想要连接的硬件(或更准确地说,硬件驱动程序).连接的代码如下: void Device::connect(const std::vector<int>& vec){ // do some stuff with vec that takes a long time } 我遇到的问题是设备驱动程序让我异常,因为他们从vec中获得了不好的价值.事实上,当我打破连接时,数据就消失了:在那个范围内,vec是空的内存.我通过使用shared_ptrs修复了问题. 我的理论是,当我从GUI线程调用dev.connect(vec)时,Qt实际上将该调用放在一个单独的线程上.然后,该函数需要很长时间,Qt决定是时候继续并完成onClick(或类似的东西,可能会立即发生),以便在vec在Device :: connect中处理时,它已经出来了范围.鉴于shared_ptr在这里节省了一天的事实,这适合. 所以我的问题是,我对此是对的吗?有人可以解释Qt的隐式线程行为的细节,或者指出一些这样的解释? 解决方法
您要问的是,QT ui线程是否有可能在某个任务中花费这么长时间,它会被中断,从函数返回,然后尝试从它停止的位置继续.
答案是不.如果一个线程被中断,那么它将返回到它的确切位置,或者即将终止.尝试不这样做可能会被病毒扫描程序和标记器标记.介绍令人讨厌的讨厌的错误. 如果你尝试在UI线程中做一些需要很长时间的事情,那么可能会发生的是你的UI变得没有响应,操作系统会抱怨应用程序没有响应(因为应用程序不再能够对事件作出反应)由操作系统发送给它). 更有可能的是,当QT中的信号被提升时,无法保证它会立即传递到插槽,因此您最终会遇到您正在描述的情况. shared_ptr’节省了一天’的事实意味着你没有看到你正在破坏你的堆栈的情况(一件好事,它们很难调试);一个简单的堆栈跟踪应该回答你的问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |