QThread 线程暂停 停止功能的实现
为了实现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重建线程";
- }
- }
QThread 线程暂停 停止功能的实现的更多相关文章
- java线程之停止线程
在Java中有以下3种方法可以终止一个正在运行的线程: 1.使用退出标志,是线程正常退出,也就是run方法完成后线程终止. 2.使用stop方法强制终止线程,但不推荐使用 ...
- Android中的java层的线程暂停和恢复实现
/** * 基础线程对象. * * @author jevan * @version (1.0 at 2013-6-17) * @version (1.1 at 2013-7-2) 增加on ...
- 重点:怎样正确的使用QThread类(注:包括推荐使用QThread线程的新方法QObject::moveToThread)
背景描述: 以前,继承 QThread 重新实现 run() 函数是使用 QThread唯一推荐的使用方法.这是相当直观和易于使用的.但是在工作线程中使用槽机制和Qt事件循环时,一些用户使用错了.Qt ...
- iOS 9音频应用播放音频之播放控制暂停停止前进后退的设置
iOS 9音频应用播放音频之播放控制暂停停止前进后退的设置 ios9音频应用播放控制 在“iOS 9音频应用播放音频之ios9音频基本功能”一文可以看到AVAudioPlayer类有很多的属性以及方法 ...
- java 线程实现、线程暂停和终止 、线程联合join、线程基本信息获取和设置、线程优先级
转载地址:速学堂 https://www.sxt.cn/Java_jQuery_in_action/eleven-inheritthread.html 1. 通过继承Thread类实现多线程 继承Th ...
- Java如何检查线程是否停止?
在Java编程中,如何检查线程是否停止? 以下示例演示如何通过使用isAlive()方法来检查线程是否已停止. // from W w w .Y I I b AI.c o M package com. ...
- Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? 线程的sleep()方法和yield()方法有什么区别?
Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间 ...
- WPF 精修篇 长时间线程加取消功能
原文:WPF 精修篇 长时间线程加取消功能 <Grid> <Grid.RowDefinitions> <RowDefinition Height="11*&qu ...
- 【多线程学习笔记整理】002_线程的停止、暂停、与yield
一.停止线程的三种方式 停止线程是多线程中的一个很重要的点,停止线程意味着在线程处理完当前任务之前终止正在做的操作,但是如果不能正确的操作,可能会发生不可预期的结果. 1)使用退出标志,使线程正常退出 ...
随机推荐
- ztree在onCheck()方法中防止因触发联动关系导致页面多次渲染而卡死的问题
这几天在项目中遇到了要使用树形选择框, 而且要求比较复杂,具体叙述如下: 首先是有个选择框,左边选择是适用的商品,右边显示已经选择的商品.也就是说,左边每次勾选操作,都要触发一个事件去刷新右边的页面, ...
- 使用的jQuery加载源的优势【问题】
[问题]使用的jQuery加载源的优势? [答案]许多用户在访问其他站点时,已经从谷歌或微软加载过 jQuery.所有结果是,当他们访问您的站点时,会从缓存中加载 jQuery,这样可以减少加载时间. ...
- 四、TreeSet
HashSet 是无序的,如果要对集合实现排序,那么就需要使用TreeSet 让TreeSet 实现集合有序有两种方法 一.让元素自身具备比较排序功能,具备比较排序功能的元素只需要实现Comparab ...
- 从graphql endpoint获取schema文件
graphql server端有更新,client端需要重新获取schema文件用于创建新的api request,下面简要记录如何从graphql endpoint获取schema文件 You ca ...
- jq 停止/结束多个ajax请求
页面按钮: <button id="song">abort</button> 请求: var str = {} str.xhr = $.ajax({ typ ...
- flume 1.7在windows下的安装部署与测试运行
一.安装 安装java,配置环境变量. 安装flume,下载地址,下载后直接解压即可. 二.运行 创建配置文件:在解压后的文件 apache-flume-1.7.0-bin\conf下创建一个exam ...
- element-ui组件,全选树节点,新增数据子节点数据,出现回填问题
案情分析:全选后父节点被选中保存,在这个树节点下新增数据时,就会出现,也被选中,事实上数据是没有被选中,也就意味着权限未被配置,而显示是已经配置了,显然这个是一个bug 1.处理前,直接用下面的方法很 ...
- 批量删除redis
批量删除"aso_"开头的key:redis-cli keys aso_* | xargs redis-cli del
- Linux终端彩色显示输出结果
转义序列符 为了添加个人风格的彩色提示符,我们需要使用转义序列符.一个转义序列符是一个控制命令,它控制Shell执行某个特定的动作.一个转义序列符通常以 ESC开始,在Shell中被记录为" ...
- 修改HTTPS加密协议TLS1.0为TLS1.2
一:首先为什么要改为TLS1.2 因为各大浏览器相继发布声明将停止支持 TLS 1.0 和 TLS 1.1 https://www.cnblogs.com/jpush88/p/9846047.html ...