您的位置:首页 > 编程语言 > Qt开发

Qt 多线程

2016-06-28 15:18 309 查看
这两天在研究Qt的多线程,之前一直被搞的有点迷糊,一会儿是子线程执行,一会儿是主线程执行,刚开始以为子线程只能执行run函数中的带代码,现在发现并不然。。

自己也是查了大量资料才有所收货的,有一篇文章写的还是不错的,http://blog.csdn.net/lutx/article/details/7353957,大家可以看看,我也是借鉴了这篇博客。

1. 首先觉得自己忽略了一个问题,就是connect连接,之前一直没想明白子线程中连接的槽函数难道不应该是子线程去执行吗?楼主愚钝,后来才恍然大悟,其实就是看connect中槽函数对象指针在那个线程,之前真是笨,就没想到这点。

2.QObject的connect函数有几种连接方式,

      a) DirectConnection,信号发送后槽函数立即执行,由sender的所在线程执行;

      b) QueuedConnection,信号发送后返回,相关槽函数由receiver所在的线程在返回到事件循环后执行;

      c) 默认使用的是Qt::AutoConnection,当sender和receiver在同一个线程内时,采用DirectConnection的方式,当sender和receiver在不同的线程时,采用QueuedConnection的方式。

3.还有人说:“线程间用“信号与槽”传递引用参数的话,一定要加const,因为const文字常量存在常量区中,生命周期与程序一样的长。这样可以避免slot调用的时候参数的运行期已过而使引用无效”,关于这个楼主没有得到认证,不过想想加上还是好点

4.还有如果一个对象如果不是在run函数中创建的,这个对象时属于主线程的,那就不能再run函数中使用此对象访问其成员函数,运行会报警告“QObject: Cannot create children
for a parent that is in a different thread”,如果是在run函数里面创建的就是属于子线程了,可以随意访问其成员函数

5.如果使用connect连接的信号槽不在同一个线程,比如是槽函数是子线程的的成员函数,但是连接的调用槽函数的对象是属于主线程的,如果想要子线程去执行,就可以将参数5的连接方式显示修改为:Qt::DirectConnection

其实总结出来也很简单,run函数中的肯定是子线程去执行的,至于其他函数的执行体到底是主线程还是子线程,如果是显示调用就看调用的对象属于哪个线程,如果是信号槽调用,也是看连接的槽函数的对象指针属于哪个线程,现在回头想想其实是自己没理解清楚才觉得麻烦,现在觉得好多了。

有兴趣的同学可以去看看http://blog.csdn.net/lutx/article/details/7353957这个博客,这个里面博主有详细的举例说明,我在这就不重复了。

我上面说的多线程都是继承QThread和重写run函数,其实还有另一种方法,更简单灵活些,就是MoveToThread();
创建一个新的线程,通过这个函数可以将某个对象移动到新创建的这个线程中,进而关于这个对象的一切操作就都是在新线程中执行,有好多人在QThread的构造函数中调用MovetoThread(this),这其实是错误的用法.
大家可以看看这篇文章 http://blog.csdn.net/sydnash/article/details/7425947
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: