首页 > 学院 > 开发设计 > 正文

多线程释放对象

2019-11-08 01:08:39
字体:
来源:转载
供稿:网友
在做Symbian应用开发和MeeGo应用开发时Q框架是一个统一的开发框架,很多时候需要在QThread的run中new一个QUdpSocket来收发数据.这时,这个socket对象的释放就成了一个麻烦的问题.

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

[cpp] view plain copy PRint?在CODE上查看代码片QSocketNotifier: socket notifiers cannot be disabled from another thread    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   Invalid parameter passed to C runtime function.   Invalid parameter passed to C runtime function.  

以下是解决方案:

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

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

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

代码如下:

[cpp] view%20plain copy print?UdpSocketThread::UdpSocketThread(QObject *parent) :    QThread(parent)   {   this->socket = 0;   this->needStop = false;   }      UdpSocketThread::~UdpSocketThread()   {   this->needStop = true;   quit();   wait();   }      void UdpSocketThread::run()   {   socket = new QUdpSocket;   connect(socket,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()));   socket->bind(2234);   exec();   while(this->needStop)   {   if(this->socket)   {   delete this->socket;   this->socket = 0;   }   break;   }   }   

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

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

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

PS:

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

[cpp] view%20plain copy print?UdpSocketThread::UdpSocketThread(QObject *parent) :      QThread(parent)   {   socket = 0;   }      UdpSocketThread::~UdpSocketThread()   {   this->socket->deleteLater();   quit();   wait();   }      void UdpSocketThread::run()   {   socket = new QUdpSocket;   connect(socket,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()));   socket->bind(2234);   exec();      }   
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表