文档详情

Qt多线程编程中的对象线程与函数执行线程.doc

发布:2017-04-15约8.11千字共7页下载文档
文本预览下载声明
?  HYPERLINK /lutx/article/details/7353957 Qt多线程编程中的对象线程与函数执行线程 分类:? HYPERLINK /Lutx/article/category/628953 QT? HYPERLINK /Lutx/article/category/133725 编程? HYPERLINK /Lutx/article/category/1099748 多线程2012-03-14 17:46?7604人阅读? HYPERLINK /lutx/article/details/7353957 \l comments 评论(6)? HYPERLINK /lutx/article/details/javascript:void(0); \o 收藏 收藏? HYPERLINK /lutx/article/details/7353957 \l report \o 举报 举报  HYPERLINK /tag/qt \t /lutx/article/details/_blank qt HYPERLINK /tag/%e5%a4%9a%e7%ba%bf%e7%a8%8b \t /lutx/article/details/_blank 多线程 HYPERLINK /tag/%e7%bc%96%e7%a8%8b \t /lutx/article/details/_blank 编程 HYPERLINK /tag/thread \t /lutx/article/details/_blank thread HYPERLINK /tag/class \t /lutx/article/details/_blank class HYPERLINK /tag/signal \t /lutx/article/details/_blank signal ? ? 近来用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信号。定义如下: [cpp]? HYPERLINK /lutx/article/details/7353957 \o view plain view plain HYPERLINK /lutx/article/details/7353957 \o copy copy span?style=font-family:?SimSun;?font-size:?16px;?//?define?Object?class/span?? [cpp]? HYPERLINK /lutx/article/details/7353957 \o view plain view plain HYPERLINK /lutx/article/details/7353957 \o copy copy span
显示全部
相似文档