为了实现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重建线程"; } }