QThread 線程暫停 停止功能的實現


為了實現Qt中線程的暫停運行,和停止運行的控制功能

需要在設置兩個static型控制變量。

 

 

Cpp代碼   收藏代碼
  1.        //終止原始數據單元進隊出隊,並清空數據。  
  2. static bool stopSign;  
  3. //原始數據單元隊列 允許進隊標識符  
  4. static QMutex enterQueueSign;  
  5. //原始數據單元隊列 允許出隊標識符  
  6. static QMutex outQueueSign;  

 

 

一個是終止運行的變量 stopSign

一個是暫停進隊線程的變量 enterQueueSign

另一個是暫停出隊線程的變量outQueueSign

 

stopSign、enterQueueSign 用在我的入隊線程:ImageProcessingThread,其中的Run函數如下:

如果有停止命令,我得15圈原始數據重建的過程被終止,跳出這個循環,進而結束這個線程。

如果有暫停命令,我得enterQueueSign鎖,會暫時掛起在這里等待解鎖。這個加鎖和解鎖的操作都在我得控制界面Main.cpp的函數里執行。

ImageProcessingThread的Run函數

 

 

Cpp代碼   收藏代碼
  1. void ImageProcessingThread::run()    
  2. {   
  3.     QTime t;  
  4.     double  duration;  
  5.     t.start();  
  6.     qDebug() << "時間1:" << t.currentTime().toString("hh:mm:ss.zzz");  
  7.     //影像數據對象  
  8.     CtImageRecon *ctImageRecon = new CtImageRecon();  
  9.     //圖像重建進度  
  10.     connect(ctImageRecon,SIGNAL(updateReconJobInfo(QList<QVariant>)),this,SLOT(updateReconJob(QList<QVariant>)));  
  11.     //原始數據單元隊列  
  12.     RawUnitQueue rawUnitQueue;  
  13.     qDebug() << "==>>ImageProcessingThread<<==影像數據處理開始,線程Id:" << QThread::currentThreadId();  
  14.   
  15.     forint i = 0; i < 15;i++)  
  16.     {  
  17.         //終止了影像處理  
  18.         if(RawUnitQueue::stopSign)  
  19.             break;  
  20.         //是否允許原始數據單元隊列 出隊  
  21.         RawUnitQueue::outQueueSign.lock();  
  22.         //是否存在已用空間  
  23.         RawUnitQueue::rawTurnsUsedSpace.acquire();  
  24.         //CT重建  
  25.         ctImageRecon->recon(reconJob);  
  26.         sleep(3);  
  27.         rawUnitQueue.removeFirstRawTurn();  
  28.         RawUnitQueue::rawTurnsFreeSpace.release();  
  29.         qDebug() << "ImageProcessingThread:" << i;    
  30.         RawUnitQueue::outQueueSign.unlock();  
  31.     }  
  32.       
  33.     qDebug() << "==>>ImageProcessingThread<<==影像數據處理完畢,線程Id:" << QThread::currentThreadId();      
  34.       
  35.     qDebug() << "時間2:" << t.currentTime().toString("hh:mm:ss.zzz");  
  36.     duration = t.elapsed() ;  
  37.     qDebug() << "ImageProcessingThread消耗時間:" << duration << "ms";  
  38.   
  39.   
  40. }    

 Main.cpp

暫停影像處理進隊線程函數

 

Cpp代碼   收藏代碼
  1. /** 
  2.  *函數介紹:暫停Ct影像重建線程 
  3.  *輸入參數:無 
  4.  *返回值:  無 
  5.  */  
  6. void MainWindow::suspendCtImageReconThread()  
  7. {  
  8.     if(ctImageReconThread->isRunning())  
  9.     {  
  10.           
  11.         ui.startImageReconBtn->setEnabled(true);  
  12.         ui.startImageReconBtn->setText("繼續重建");  
  13.         ui.suspendImageReconBtn->setEnabled(false);  
  14.         //暫停原始數據單元隊列 進隊  
  15.         RawUnitQueue::enterQueueSign.lock();  
  16.         qDebug() << "【命令】暫停原始數據單元隊列 進隊";  
  17.         //暫停原始數據單元隊列 出隊  
  18.         RawUnitQueue::outQueueSign.lock();  
  19.         qDebug() << "【命令】暫停原始數據單元隊列 出隊";  
  20.   
  21.     }  
  22. }  

 

 

停止影像處理進隊線程函數

 

Cpp代碼   收藏代碼
  1. /** 
  2.  *函數介紹:停止Ct影像重建線程 
  3.  *輸入參數:無 
  4.  *返回值:  無 
  5.  */  
  6. void MainWindow::stopCtImageReconThread()  
  7. {  
  8.     if(ctImageReconThread->isRunning())  
  9.     {  
  10.   
  11.         ui.startImageReconBtn->setEnabled(true);  
  12.         ui.startImageReconBtn->setText("開始重建");  
  13.         ui.suspendImageReconBtn->setEnabled(false);  
  14.         ui.stopImageReconBtn->setEnabled(false);  
  15.         //終止了影像處理  
  16.         RawUnitQueue::stopSign = true;  
  17.         ctImageReconThread->quit();  
  18.         qDebug() << "【命令】停止CT重建線程";  
  19.   
  20.     }  
  21. }  


免責聲明!

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



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