當前位置:編程學習大全網 - 編程語言 - 如何釋放線程中創建的QUdpSocket對象

如何釋放線程中創建的QUdpSocket對象

重印經常需要壹個新的QUdpSocket在QThread的運行中發送和接收數據。這時,這個socket對象的釋放就成了壹個麻煩的問題。

如果socket對象在thread的析構函數中被直接刪除,會出現如下異常:

QSocketNotifier:套接字通知程序不能從另壹個線程禁用

QCoreApplication::sendEvent中的ASSERT失敗:"無法將事件發送到不同線程擁有的對象。當前線程560cb8。在文件kernel/qcoreapplication.cpp的第349行的線程a617748”中創建了接收器”(類型為“QNativeSocketEngine”)

傳遞給C運行時函數的參數無效。

傳遞給C運行時函數的參數無效。

以下是解決方案:

1.在線程中定義壹個線程釋放的標識符。

2.在run()中使用while判斷這個標識符來結束socket對象。

3.在線程析構函數中,設置標誌並使用quit()和wait()。

代碼如下:

UDP socket thread::UDP socket thread(q object * parent):

QThread(父)

{

這-& gt;socket = 0;

這-& gt;needStop = false

}

UDP socket thread::~ UDP socket thread()

{

這-& gt;needStop = true

quit();

wait();

}

void UdpSocketThread::run()

{

socket = new QUdpSocket

connect(socket,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams());

套接字-& gt;bind(2234);

exec();

while(this-& gt;needStop)

{

如果(this-& gt;插座)

{

刪除這個-& gt;插座;

這-& gt;socket = 0;

}

打破;

}

}

這個線程對象的發布是有代表性的,應該可以解決很多類似的問題。

除此之外,可能還有其他方法,這裏只是壹種。

其實問題的關鍵在於線程中創建的對象必須在線程中釋放。

PS:

經過shiroki的修正,QT其實有了更好的釋放對象的機制。即deleteLater()。所以,事情很簡單。請看代碼:

UDP socket thread::UDP socket thread(q object * parent):

QThread(父)

{

socket = 0;

}

UDP socket thread::~ UDP socket thread()

{

這-& gt;套接字-& gt;delete later();

quit();

wait();

}

void UdpSocketThread::run()

{

socket = new QUdpSocket

connect(socket,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams());

套接字-& gt;bind(2234);

exec();

}

  • 上一篇:遼交就業率最高的專業
  • 下一篇:SoftEther 1.0使用教程
  • copyright 2024編程學習大全網