自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Qt開(kāi)發(fā):釋放線程中創(chuàng)建的QUdpSocket對(duì)象

移動(dòng)開(kāi)發(fā)
在做Symbian應(yīng)用開(kāi)發(fā)和MeeGo應(yīng)用開(kāi)發(fā)時(shí)Q框架是一個(gè)統(tǒng)一的開(kāi)發(fā)框架,很多時(shí)候需要在QThread的run中new一個(gè)QUdpSocket來(lái)收發(fā)數(shù)據(jù).這時(shí),這個(gè)socket對(duì)象的釋放就成了一個(gè)麻煩的問(wèn)題.

51CTO編者按:在做Symbian應(yīng)用開(kāi)發(fā)和MeeGo應(yīng)用開(kāi)發(fā)時(shí)Q框架是一個(gè)統(tǒng)一的開(kāi)發(fā)框架,很多時(shí)候需要在QThread的run中new一個(gè)QUdpSocket來(lái)收發(fā)數(shù)據(jù).這時(shí),這個(gè)socket對(duì)象的釋放就成了一個(gè)麻煩的問(wèn)題.

如果在thread的析構(gòu)中直接delete這個(gè)socket對(duì)象,則會(huì)出現(xiàn)如下異常:

  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. 

以下是解決方案:

◆在線程中定義一個(gè)線程釋放的標(biāo)識(shí)

◆在run()中用while來(lái)判斷這個(gè)標(biāo)識(shí),以便于結(jié)束socket對(duì)象.

◆在thread的析構(gòu)中,設(shè)定標(biāo)識(shí),并使用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; 

這個(gè)線程對(duì)象的釋放比較有代表性,應(yīng)該可以解決很多類(lèi)似的問(wèn)題.

另外,方法可能還有其他的,這里只是舉了一種而已.

 

其實(shí),問(wèn)題的關(guān)鍵就是:線程中創(chuàng)建的對(duì)象就必須在線程中釋放.

 

PS:

經(jīng)shiroki的指正,其實(shí)QT有更好的機(jī)制來(lái)釋放對(duì)象.那就是deleteLater(). 于是,事情就顯得非常簡(jiǎn)單,請(qǐng)看代碼:

  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移動(dòng)開(kāi)發(fā)線下技術(shù)沙龍

活動(dòng)日期:1月15日
本期主題:Android應(yīng)用開(kāi)發(fā)技術(shù)進(jìn)階
地點(diǎn):北京市海淀區(qū)中關(guān)村南大街30號(hào)東聯(lián)藝術(shù)工社
演講講師:范懷宇(網(wǎng)易)

【編輯推薦】

  1. QTreeWidget設(shè)計(jì)解決沒(méi)有拖動(dòng)項(xiàng)問(wèn)題
  2. Symbian和MeeGo將統(tǒng)一開(kāi)發(fā)環(huán)境 Qt壓力很大
  3. QtCreator:MeeGo開(kāi)發(fā)程序入門(mén)手冊(cè)
  4. 諾基亞發(fā)布Qt 4.6版本 支持多點(diǎn)觸摸和手勢(shì)輸入
  5. 在QT SDK下構(gòu)建MeeGo Touch開(kāi)發(fā)環(huán)境

 

 

責(zé)任編輯:佚名 來(lái)源: cuteqt
相關(guān)推薦

2010-03-31 10:07:09

Oracle shar

2010-03-17 14:58:20

Java多線程

2011-06-13 10:03:19

Qt 多線程 編程

2010-03-18 15:31:13

Java創(chuàng)建線程

2011-06-14 11:48:38

Webkit QT

2010-01-21 11:25:44

linux多線程線程資源

2011-06-30 17:31:32

Qt 多線程 信號(hào)

2011-06-14 09:46:11

Qt QThread 線程

2011-06-23 15:10:39

Qt 窗體

2011-07-01 11:18:50

Qt 多線程

2010-03-18 15:47:07

Java創(chuàng)建線程

2011-06-24 11:03:31

Qt 多線程 線程

2011-06-20 13:43:08

Qt Socket 線程

2011-06-24 11:12:39

Qt 多線程 線程

2011-06-20 15:52:14

Qt Designer 控件

2011-06-24 10:05:51

QT 對(duì)象 父對(duì)象

2011-06-22 10:12:08

Qt 線程

2011-06-13 13:06:48

Gtk Qt

2011-06-14 10:52:10

QT QTreeView

2009-04-30 09:10:42

JavaSwing線程安全
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)