Qt开发:释放线程中创建的QUdpSocket对象
2014-05-09 10:06
302 查看
在做Symbian应用开发和MeeGo应用开发时Q框架是一个统一的开发框架,很多时候需要在QThread的run中new一个QUdpSocket来收发数据.这时,这个socket对象的释放就成了一个麻烦的问题.
51CTO编者按:在做Symbian应用开发和MeeGo应用开发时Q框架是一个统一的开发框架,很多时候需要在QThread的run中new一个QUdpSocket来收发数据.这时,这个socket对象的释放就成了一个麻烦的问题.
如果在thread的析构中直接delete这个socket对象,则会出现如下异常:
以下是解决方案:
◆在线程中定义一个线程释放的标识
◆在run()中用while来判断这个标识,以便于结束socket对象.
◆在thread的析构中,设定标识,并使用quit()和wait().
代码如下:
这个线程对象的释放比较有代表性,应该可以解决很多类似的问题.
另外,方法可能还有其他的,这里只是举了一种而已.
其实,问题的关键就是:线程中创建的对象就必须在线程中释放.
PS:
经shiroki的指正,其实QT有更好的机制来释放对象.那就是deleteLater(). 于是,事情就显得非常简单,请看代码:
51CTO编者按:在做Symbian应用开发和MeeGo应用开发时Q框架是一个统一的开发框架,很多时候需要在QThread的run中new一个QUdpSocket来收发数据.这时,这个socket对象的释放就成了一个麻烦的问题.
如果在thread的析构中直接delete这个socket对象,则会出现如下异常:
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().
代码如下:
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(). 于是,事情就显得非常简单,请看代码:
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(); }
相关文章推荐
- Qt开发:释放线程中创建的QUdpSocket对象
- 如何释放线程中创建的QUdpSocket对象
- Qt中次线程里创建对象,出现Cannot create children for a parent that is in a different thread
- android 使用UDP发送数据 DatagramSocket 创建对象为null
- Qt中次线程里创建对象,出现Cannot create children for a parent that is in a different thread
- QT 创建UDP Socket通信
- .net开发Ae释放com对象的问题
- Windows线程创建、退出及资源释放
- Qt 关于对象创建时parent的问题
- Swift开发:GCDAsyncUdpSocket 通信之UDP广播
- 源码-JavaScript&jQuery交互式前端开发-第3章-函数、方法与对象-使用构造函数语法创建对象
- QT学习之路————如何创建一个线程
- iOS开发中单例对象的标准创建方法
- QT tcp Socket 通信开发
- Web版PACS开发纪要一:关闭动态库中创建的线程
- 在Ubuntu14.04上创建Qt 5.4.0开发环境
- MFC中创建多线程 MFC对象指针不能在线程间传输
- iOS开发之多线程(NSThread创建线程)
- Qt多线程间信号槽传递非QObject类型对象的参数
- Linux下应用程序开发:用QT创建新风格