为了实现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重建线程";
}
}
分享到:
相关推荐
实现三个线程同时执行,且可以单独关闭和运行,通过进度条实现可视化演示。
Qt 使用多线程QThread实现进度条
1.引言多线程对于需要处理耗时任务的应用很有用,一方面响应用户操作、更新界面显示,另一方面在“后台”进行耗时操作,比如大量运算、复制大文件、网络传输等。使用Qt
Qt之线程的开始暂停恢复停止 源码 win10 mingw32 编译通过
用PyQt中的QThread类实现多线程 利用PyQt中的pyqtSignal类实现信息的触发和捕获,即定义事件和订阅事件 利用QThread类实现多线程的方法 1,新建一个python类,继承自QThread from PyQt5.QtCore import QThread ...
1.这个采用自定以的信号和槽 2.使用QThread来实现线程 3.在初始化的时候启动线程,利用标志位来控制线程的启动停止; 4.在槽函数和析构函数中实现控制线程的停止; 5.安全退出线程,不会导致崩溃。
多线程案例,是关于QT在VS2010平台的多线程小案例
QT线程QThread的推荐用法 在 代码示例中, QT线程单次运行一个函数,推荐用QtConcurrent::run() 在另一个线程中运行一个函数
本示例采用继承QThread的方式创建线程,在创建的子线程中计数,并将计数的数值通过信号与槽的方式发送至主线程,在主线程的UI界面上显示出来。
对于航拍图像序列,结合Qt中Qthread,多线程并发拼接。分组处理。可使用NPU-DRONEMAP进行实验,提供一种解决思路
主要介绍了详解pyqt5 动画在QThread线程中无法运行问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
前面在pyqt5多线程(QThread)遇到的坑(一)中提到了先实例化类,再把实例对象传参到线程类,这样的确实可行,但是还是遇到了新坑。 pyqt5多线程(QThread)遇到的坑(一 起因 被实例化的类是做数据处理的,传入和...
参照Gt5官方说明文档,在控制台中实现了一个交互终端,编写了线程类,封装了QThread,将耗时函数类Worker采用moveToThread方法放到QThread线程中。并通过命令字控制线程的开启和关闭。
Qt+Opencv+QThread,Qt多线程同时显示多路USB摄像头信息至ui界面, 请注意,每个USB摄像头应单独连接至PC机,不能将多个USB摄像头连接在同一个USB hub上再连接PC机; 适用于刚接触Opencv,Qt,希望通过Qt结合Opencv...
1.资源简介:PyQt5中使用多线程模块QThread解决了PyQt5界面程序执行比较耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题,采用线程池ThreadPoolExecutor解决了ping多个IP多任务耗时问题。...
主要介绍了PyQt5中多线程模块QThread使用方法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
QT多线程的实现方式:QThread run https://blog.csdn.net/qq_43445867/article/details/132797225
Qt案例之利用QThread类实现简单多线程案例循环打印数字,可参考文章:https://blog.csdn.net/didi_ya/article/details/122661092
QT多线程的实现方式:QThread run优雅的创建与退出QT多线程 https://blog.csdn.net/qq_43445867/article/details/132797225