使用moveToThread線程並正確回收內存的方式


用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結束

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM