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

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

ID:40565322

大小:134.45 KB

页数:7页

时间:2019-08-04

Qt多线程编程中的对象线程与函数执行线程_第1页
Qt多线程编程中的对象线程与函数执行线程_第2页
Qt多线程编程中的对象线程与函数执行线程_第3页
Qt多线程编程中的对象线程与函数执行线程_第4页
Qt多线程编程中的对象线程与函数执行线程_第5页
资源描述:

《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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。