永发信息网

如何释放线程中创建的QUdpSocket对象

答案:1  悬赏:50  手机版
解决时间 2021-04-06 03:41
如何释放线程中创建的QUdpSocket对象
最佳答案
转载很多时候需要在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.

  以下是解决方案:

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

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

  3.在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();

  }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
陆地巡洋舰V8与雷克萨斯LX570谁的越野更强些
赵骏的《你就不要想起我》伴奏!!!
三集片怎么下载
教师中级职称是什么,建筑 中级职称考试都什么
单选题下列发生的天气现象与冷锋无关的是A.北
关于励志积极向上诗歌,求一篇积极向上的,关
百度百科上面的《快乐星球5》的上映时间怎么
中国人有天生的红头发吗??
玻璃电极在使用前应如何处理?为什么?
8320000000元改写成用亿作单位的数是________
暂停了社保8年多现在续交可以报销吗
深处作文段首排比句
嘉言懿行,承天之佑什么意思
天空中有多少卫星,天空上有多少棵卫星???
平安证券体验金收益一直不到账怎么破
推荐资讯
不好意思是什么意思,+_+ 这个表情是什么意思
穴是什么意思,女人有什么穴?
求炫舞耽美小说!!!!急求!
怎样使屋子里更凉快
<回家的诱惑》中 后来林品如有没有生孩子?是
泰州学院是一所很好的大学吗?
达州到广安有多少公里,达州到通江溶洞多少公
我母亲被人打了,警务或者法律处理流程是怎样
从滨州到威海多长时间,从威海到上海坐汽车需
establish与build的区别
飘荡的意思是什么
毕业典礼条幅标语,如何看待清华大学2013年研
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?