多线程释放对象

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

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

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  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().

代码如下:


[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. UdpSocketThread::UdpSocketThread(QObject *parent) :   
  2.  QThread(parent)   
  3. {   
  4. this->socket = 0;   
  5. this->needStop = false;   
  6. }   
  7.    
  8. UdpSocketThread::~UdpSocketThread()   
  9. {   
  10. this->needStop = true;   
  11. quit();   
  12. wait();   
  13. }   
  14.    
  15. void UdpSocketThread::run()   
  16. {   
  17. socket = new QUdpSocket;   
  18. connect(socket,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()));   
  19. socket->bind(2234);   
  20. exec();   
  21. while(this->needStop)   
  22. {   
  23. if(this->socket)   
  24. {   
  25. delete this->socket;   
  26. this->socket = 0;   
  27. }   
  28. break;   
  29. }   
  30. }   

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

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

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

PS:

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

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. UdpSocketThread::UdpSocketThread(QObject *parent) :   
  2.    
  3. QThread(parent)   
  4. {   
  5. socket = 0;   
  6. }   
  7.    
  8. UdpSocketThread::~UdpSocketThread()   
  9. {   
  10. this->socket->deleteLater();   
  11. quit();   
  12. wait();   
  13. }   
  14.    
  15. void UdpSocketThread::run()   
  16. {   
  17. socket = new QUdpSocket;   
  18. connect(socket,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()));   
  19. socket->bind(2234);   
  20. exec();   
  21.    
  22. }   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值