如果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();
}