• 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. }  
  • 相关阅读:
    史记 · 码农列传
    死侍在新片中,扮演了一个 AI 驱动的 NPC
    什么是高中物理?一篇长长长长文告诉你!
    你管这玩意叫网络?
    你管这破玩意叫计算机?
    try-catch-finally中的4个巨坑,老程序员也搞不定!
    未来几年,软件测试九大新兴趋势
    代码中大量的if/else,你有什么优化方案?
    PHP部署服务端常见问题整理
    PHP服务端环境搭建
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3757434.html
Copyright © 2020-2023  润新知