xzoscar的个人主页

http://www.qtcn.org/bbs/u/132563  [收藏] [复制]

xzoscar

XZoscar@163.com

  • 40

    关注

  • 18

    粉丝

  • 39

    访客

  • 等级:新手上路
  • 总积分:42
  • 保密,2011-01-01

最后登录:2013-08-13

更多资料

日志

摘:Qt中多线程实现Socket编程注意问题

2013-03-03 21:59
本文介绍的是Qt中采用多线程Socket编程,由于工作的需要,开始接触Qtsocket编程。Qt里的example是个不错的教程,但是当我把代码移植到多线程的环境时就出问题了:
  1. QObject: Cannot create children for a parent that is in a different thread.

由于想要在线程中保留一个socket,以便维持双边通信,因此定义如下:
  1. SocketThread:public QThread  
  2.     {  
  3.             ....  
  4.             private:  
  5.                   QTcpSocket _tcpSocket;  
  6.      }

但是这段代码并无法正常的完成工作,后来在网上搜了一下资料,找到以下解释(忘了出处了,以下是中文的大概意思):“
在QThread中定义的所有东西都属于创建该QThread的线程。“
问题出来了,如果按照这个定义,在SocketThread中定义的_tcpSocket,其实是属于mainThread(SocketThread是在main函数中创建),而当我们在SocketThread中的run函数使用到_tcpSocket的时候,其实是跨线程调用,这样就会出现上面的异常。
解决方法: 需要对SocketThread的定义做一下更改:
  1. SocketThread:public QThread  
  2.     {  
  3.             ....  
  4.             private:  
  5.                   QTcpSocket* _tcpSocket;  
  6.      }

在上面我们并没有创建具体的对象,而是定义了一个指针,而如何让指针内的内容从属于SocketThread这个线程呢?答案就是要在SocketThread的run方法中初始化:
  1. SocketThread::run()  
  2.     ... ;  
  3.      _tcpSocket = new QTcpSocket();  

进行以上修改之后上面的异常就不再出现了。
小结:Qt中采用多线程Socket编程的内容介绍完了,在编程过程中我们也不免接触多线程,相信也有一定的了解,最后希望本文对你有所了解!!!
分类:默认分类|回复:1|浏览:1612|全站可见|转载
 
 
删除

xzoscar

2013-03-10 09:42 -

Powered by phpwind v8.7 Certificate Copyright Time now is:04-29 13:38
©2005-2016 QTCN开发网 版权所有 Gzip disabled