用udp舉例子。
1、封裝QUdpSocket類名為Myudp,QUdpSocket的new和delete都必須要要在子線程
new:
delete:
2、在main里生成封裝的對象
udp = new Myudp;//頭文件里聲明 QObject::connect(&udpThread,&QThread::finished,[=](){ Mymethod::record("quit udpthread",PRINT_INFO); udp->deleteLater(); }); udp->moveToThread(&udpThread); udpThread.start();
3、在main的析構函數里退出線程
udpThread.quit();
udpThread.wait();
總結:
按照上面的方式就能正確回收內存,關閉程序Qt也不會告訴你“程序強制結束”之類的話,為什么能達到這各效果,有下面幾個核心:
1、Myudp中QUdpSocket的new和delete都要放在槽函數里執行
new必須要在槽函數能理解,因為我們知道movoToThread的特性就是:只有在目標線程里new的對象才能正常在這個線程里運行,而構造函數是在main里運行的,自然只能在槽函數里new;
而我們往往習慣把delete放在析構函數里(本人就是這樣使用了好幾年),雖然對程序影響不大,但是這樣QUdpSocket不會由程序員回收而是被操作系統回收的,因為析構函數也是運行在主線程的,根本原因和上面一樣:構造函數和析構函數都是運行在main里的。
2、在main里的Myudp對象要聲明成指針類型
測試的來,原因還沒深究;然后要把依附線程的退出信號和Myudp的deleter連接起來
3、在main的析構里讓QThread結束