Lv.的博客

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. }  
posted @ 2014-05-28 16:56  Avatarx  阅读(14168)  评论(0编辑  收藏  举报