Qt开发:释放线程中创建的QUdpSocket对象
创始人
2024-07-19 02:50:15
0

51CTO编者按:在做Symbian应用开发和MeeGo应用开发时Q框架是一个统一的开发框架,很多时候需要在QThread的run中new一个QUdpSocket来收发数据.这时,这个socket对象的释放就成了一个麻烦的问题.

如果在thread的析构中直接delete这个socket对象,则会出现如下异常:

  1. QSocketNotifier: socket notifiers cannot be disabled from another thread  
  2. ASSERT failure in QCoreApplication::sendEvent: “Cannot send events to objects owned by a different thread. Current thread 560cb8. Receiver ” (of type ‘QNativeSocketEngine’) was created in thread a617748″, file kernel\qcoreapplication.cpp, line 349 
  3. Invalid parameter passed to C runtime function. 
  4. Invalid parameter passed to C runtime function. 

以下是解决方案:

◆在线程中定义一个线程释放的标识

◆在run()中用while来判断这个标识,以便于结束socket对象.

◆在thread的析构中,设定标识,并使用quit()和wait().

代码如下:

  1. UdpSocketThread::UdpSocketThread(QObject *parent) : 
  2.  QThread(parent) 
  3. this->socket = 0; 
  4. this->needStop = false; 
  5.  
  6. UdpSocketThread::~UdpSocketThread() 
  7. this->needStop = true; 
  8. quit(); 
  9. wait(); 
  10.  
  11. void UdpSocketThread::run() 
  12. socket = new QUdpSocket; 
  13. connect(socket,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams())); 
  14. socket->bind(2234); 
  15. exec(); 
  16. while(this->needStop) 
  17. if(this->socket) 
  18. delete this->socket; 
  19. this->socket = 0; 
  20. break; 

这个线程对象的释放比较有代表性,应该可以解决很多类似的问题.

另外,方法可能还有其他的,这里只是举了一种而已.

 

其实,问题的关键就是:线程中创建的对象就必须在线程中释放.

 

PS:

经shiroki的指正,其实QT有更好的机制来释放对象.那就是deleteLater(). 于是,事情就显得非常简单,请看代码:

  1. UdpSocketThread::UdpSocketThread(QObject *parent) : 
  2.  
  3. QThread(parent) 
  4. socket = 0; 
  5.  
  6. UdpSocketThread::~UdpSocketThread() 
  7. this->socket->deleteLater(); 
  8. quit(); 
  9. wait(); 
  10.  
  11. void UdpSocketThread::run() 
  12. socket = new QUdpSocket; 
  13. connect(socket,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams())); 
  14. socket->bind(2234); 
  15. exec(); 
  16.  

 

Phone Club——51CTO移动开发线下技术沙龙

活动日期:1月15日
本期主题:Android应用开发技术进阶
地点:北京市海淀区中关村南大街30号东联艺术工社
演讲讲师:范怀宇(网易) 点击报名

【编辑推荐】

  1. QTreeWidget设计解决没有拖动项问题
  2. Symbian和MeeGo将统一开发环境 Qt压力很大
  3. QtCreator:MeeGo开发程序入门手册
  4. 诺基亚发布Qt 4.6版本 支持多点触摸和手势输入
  5. 在QT SDK下构建MeeGo Touch开发环境

 

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...