设为首页 加入收藏

TOP

Qt多线程编程中的对象线程与函数执行线程
2014-11-24 13:33:50 来源: 作者: 【 】 浏览:1
Tags:线程 编程 对象 函数 执行

近来用Qt编写一段多线程的TcpSocket通信程序,被其中Qt中报的几个warning搞晕了,一会儿是说“Cannot create children for a parent that is in a different thread”,有时候又是“QSocketNotifier: socket notifiers cannot be enabled from another thread”,还经常又Assert failure:Cannot send events toobjects owned by a different thread,从而导致程序崩溃。


为彻底搞清原因并解决问题,在查阅大量资料和Qt文档之后,理清了其中的机制,也对多线程编程中的QObject对象创建以及connect执行有更清楚的认识:


1. 一个对象的线程就是创建该对象时的线程,而不论该对象的定义是保存在那个线程中;


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


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


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


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


为了更清楚的理解这些问题,在此特编了个小例子说明一下。首先定义一个从QObject继承的类SomeObject,包含一个信号someSignal和一个成员函数callEmitSignal,此函数用于发送前面的someSignal信号。定义如下:


// define Object class


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Tiny6410移植tslib1.4 下一篇Qt错误:Q_ASSERT failed in qt_w..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: