加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 当从外部对象调用方法时,qt的gui线程产生线程吗?

发布时间:2020-12-16 07:22:21 所属栏目:百科 来源:网络整理
导读:最近我在c中开发基于Qt的应用程序时遇到了线程/内存问题,我正在寻找正确的解释.我不能真正发布一个功能齐全的例子,因为这需要链接到Qt等.但问题很清楚地在几个简短的线条中解释. 当我点击gui上的按钮时,会出现类似的情况: void MainWindow::onClick(){ std:
最近我在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’节省了一天’的事实意味着你没有看到你正在破坏你的堆栈的情况(一件好事,它们很难调试);一个简单的堆栈跟踪应该回答你的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读