欢迎来到天天文库
浏览记录
ID:40565322
大小:134.45 KB
页数:7页
时间:2019-08-04
《Qt多线程编程中的对象线程与函数执行线程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Qt多线程编程中的对象线程与函数执行线程分类: QT 编程 多线程2012-03-1417:46 7604人阅读 评论(6) 收藏 举报qt多线程编程threadclasssignal 近来用Qt编写一段多线程的TcpSocket通信程序,被其中Qt中报的几个warning搞晕了,一会儿是说“Cannotcreatechildrenforaparentthatisinadifferentthread”,有时候又是“QSocketNotifier:socketnotifierscannotbeenabledfromanotherthread”
2、,还经常又Assertfailure:Cannotsendeventstoobjectsownedbyadifferentthread,从而导致程序崩溃。 为彻底搞清原因并解决问题,在查阅大量资料和Qt文档之后,理清了其中的机制,也对多线程编程中的QObject对象创建以及connect执行有更清楚的认识: 1.一个对象的线程就是创建该对象时的线程,而不论该对象的定义是保存在那个线程中; 2.QObject的connect函数有几种连接方式, a)DirectConnection,信号发送后槽函数立即执行,由sender的所在线程
3、执行; b)QueuedConnection,信号发送后返回,相关槽函数由receiver所在的线程在返回到事件循环后执行; c)默认使用的是Qt::AutoConnection,当sender和receiver在同一个线程内时,采用DirectConnection的方式,当sender和receiver在不同的线程时,采用QueuedConnection的方式。 为了更清楚的理解这些问题,在此特编了个小例子说明一下。首先定义一个从QObject继承的类SomeObject,包含一个信号someSignal和一个成员函数callEm
4、itSignal,此函数用于发送前面的someSignal信号。定义如下:[cpp] viewplaincopy1.// define Object class [cpp] viewplaincopy1.class SomeObject : public QObject 2.{ 3. Q_OBJECT 4.publ
5、ic: 5. SomeObject(QObject* parent=0) : QObject(parent) {} 6. void callEmitSignal() // 用于发送信号的函数 7. { 8. emit someSignal(); 9. } 10.signals: 11. void someSignal(); 12.}; 13. 然后再定义一个从QThread继承的线程类SubThread,它包含一个SomeObject的对象指针obj,另外有一个s
6、lot函数someSolt,定义如下:[cpp] viewplaincopy1.class SubThread : public QThread 2.{ 3. Q_OBJECT 4.public: 5. SubThread(QObject* parent=0) : QThread(parent){} 6. virtual ~SubThread() 7. { 8. if (obj!=NULL) d
7、elete obj; 9. } 10.public slots: 11. // slot function connected to obj's someSignal 12. void someSlot(); 13.public: 14. SomeObject * obj; 15.}; 16.// slot function connected to obj's someSignal 1.void SubThread::someSlot() 2.{ 3. QString msg; 4.
8、 msg.append(this->metaObject()->className()); 5. msg.append("::obj's thread i
此文档下载收益归作者所有