為了實現Qt中線程的暫停運行,和停止運行的控制功能
需要在設置兩個static型控制變量。
- //終止原始數據單元進隊出隊,並清空數據。
- static bool stopSign;
- //原始數據單元隊列 允許進隊標識符
- static QMutex enterQueueSign;
- //原始數據單元隊列 允許出隊標識符
- static QMutex outQueueSign;
一個是終止運行的變量 stopSign
一個是暫停進隊線程的變量 enterQueueSign
另一個是暫停出隊線程的變量outQueueSign
stopSign、enterQueueSign 用在我的入隊線程:ImageProcessingThread,其中的Run函數如下:
如果有停止命令,我得15圈原始數據重建的過程被終止,跳出這個循環,進而結束這個線程。
如果有暫停命令,我得enterQueueSign鎖,會暫時掛起在這里等待解鎖。這個加鎖和解鎖的操作都在我得控制界面Main.cpp的函數里執行。
ImageProcessingThread的Run函數
- void ImageProcessingThread::run()
- {
- QTime t;
- double duration;
- t.start();
- qDebug() << "時間1:" << t.currentTime().toString("hh:mm:ss.zzz");
- //影像數據對象
- CtImageRecon *ctImageRecon = new CtImageRecon();
- //圖像重建進度
- connect(ctImageRecon,SIGNAL(updateReconJobInfo(QList<QVariant>)),this,SLOT(updateReconJob(QList<QVariant>)));
- //原始數據單元隊列
- RawUnitQueue rawUnitQueue;
- qDebug() << "==>>ImageProcessingThread<<==影像數據處理開始,線程Id:" << QThread::currentThreadId();
- for( int i = 0; i < 15;i++)
- {
- //終止了影像處理
- if(RawUnitQueue::stopSign)
- break;
- //是否允許原始數據單元隊列 出隊
- RawUnitQueue::outQueueSign.lock();
- //是否存在已用空間
- RawUnitQueue::rawTurnsUsedSpace.acquire();
- //CT重建
- ctImageRecon->recon(reconJob);
- sleep(3);
- rawUnitQueue.removeFirstRawTurn();
- RawUnitQueue::rawTurnsFreeSpace.release();
- qDebug() << "ImageProcessingThread:" << i;
- RawUnitQueue::outQueueSign.unlock();
- }
- qDebug() << "==>>ImageProcessingThread<<==影像數據處理完畢,線程Id:" << QThread::currentThreadId();
- qDebug() << "時間2:" << t.currentTime().toString("hh:mm:ss.zzz");
- duration = t.elapsed() ;
- qDebug() << "ImageProcessingThread消耗時間:" << duration << "ms";
- }
Main.cpp
暫停影像處理進隊線程函數
- /**
- *函數介紹:暫停Ct影像重建線程
- *輸入參數:無
- *返回值: 無
- */
- void MainWindow::suspendCtImageReconThread()
- {
- if(ctImageReconThread->isRunning())
- {
- ui.startImageReconBtn->setEnabled(true);
- ui.startImageReconBtn->setText("繼續重建");
- ui.suspendImageReconBtn->setEnabled(false);
- //暫停原始數據單元隊列 進隊
- RawUnitQueue::enterQueueSign.lock();
- qDebug() << "【命令】暫停原始數據單元隊列 進隊";
- //暫停原始數據單元隊列 出隊
- RawUnitQueue::outQueueSign.lock();
- qDebug() << "【命令】暫停原始數據單元隊列 出隊";
- }
- }
停止影像處理進隊線程函數
- /**
- *函數介紹:停止Ct影像重建線程
- *輸入參數:無
- *返回值: 無
- */
- void MainWindow::stopCtImageReconThread()
- {
- if(ctImageReconThread->isRunning())
- {
- ui.startImageReconBtn->setEnabled(true);
- ui.startImageReconBtn->setText("開始重建");
- ui.suspendImageReconBtn->setEnabled(false);
- ui.stopImageReconBtn->setEnabled(false);
- //終止了影像處理
- RawUnitQueue::stopSign = true;
- ctImageReconThread->quit();
- qDebug() << "【命令】停止CT重建線程";
- }
- }