为了实现Qt中线程的暂停运行,和停止运行的控制功能

需要在设置两个static型控制变量。

  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函数

  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. for( int i = 0; i < 15;i++)
  15. {
  16. //终止了影像处理
  17. if(RawUnitQueue::stopSign)
  18. break;
  19. //是否允许原始数据单元队列 出队
  20. RawUnitQueue::outQueueSign.lock();
  21. //是否存在已用空间
  22. RawUnitQueue::rawTurnsUsedSpace.acquire();
  23. //CT重建
  24. ctImageRecon->recon(reconJob);
  25. sleep(3);
  26. rawUnitQueue.removeFirstRawTurn();
  27. RawUnitQueue::rawTurnsFreeSpace.release();
  28. qDebug() << "ImageProcessingThread:" << i;
  29. RawUnitQueue::outQueueSign.unlock();
  30. }
  31. qDebug() << "==>>ImageProcessingThread<<==影像数据处理完毕,线程Id:" << QThread::currentThreadId();
  32. qDebug() << "时间2:" << t.currentTime().toString("hh:mm:ss.zzz");
  33. duration = t.elapsed() ;
  34. qDebug() << "ImageProcessingThread消耗时间:" << duration << "ms";
  35. }

Main.cpp

暂停影像处理进队线程函数

  1. /**
  2. *函数介绍:暂停Ct影像重建线程
  3. *输入参数:无
  4. *返回值:  无
  5. */
  6. void MainWindow::suspendCtImageReconThread()
  7. {
  8. if(ctImageReconThread->isRunning())
  9. {
  10. ui.startImageReconBtn->setEnabled(true);
  11. ui.startImageReconBtn->setText("继续重建");
  12. ui.suspendImageReconBtn->setEnabled(false);
  13. //暂停原始数据单元队列 进队
  14. RawUnitQueue::enterQueueSign.lock();
  15. qDebug() << "【命令】暂停原始数据单元队列 进队";
  16. //暂停原始数据单元队列 出队
  17. RawUnitQueue::outQueueSign.lock();
  18. qDebug() << "【命令】暂停原始数据单元队列 出队";
  19. }
  20. }

停止影像处理进队线程函数

  1. /**
  2. *函数介绍:停止Ct影像重建线程
  3. *输入参数:无
  4. *返回值:  无
  5. */
  6. void MainWindow::stopCtImageReconThread()
  7. {
  8. if(ctImageReconThread->isRunning())
  9. {
  10. ui.startImageReconBtn->setEnabled(true);
  11. ui.startImageReconBtn->setText("开始重建");
  12. ui.suspendImageReconBtn->setEnabled(false);
  13. ui.stopImageReconBtn->setEnabled(false);
  14. //终止了影像处理
  15. RawUnitQueue::stopSign = true;
  16. ctImageReconThread->quit();
  17. qDebug() << "【命令】停止CT重建线程";
  18. }
  19. }

QThread 线程暂停 停止功能的实现的更多相关文章

  1. java线程之停止线程

         在Java中有以下3种方法可以终止一个正在运行的线程:      1.使用退出标志,是线程正常退出,也就是run方法完成后线程终止.      2.使用stop方法强制终止线程,但不推荐使用 ...

  2. Android中的java层的线程暂停和恢复实现

    /**  * 基础线程对象.  *  * @author jevan  * @version (1.0 at 2013-6-17)  * @version (1.1 at 2013-7-2) 增加on ...

  3. 重点:怎样正确的使用QThread类(注:包括推荐使用QThread线程的新方法QObject::moveToThread)

    背景描述: 以前,继承 QThread 重新实现 run() 函数是使用 QThread唯一推荐的使用方法.这是相当直观和易于使用的.但是在工作线程中使用槽机制和Qt事件循环时,一些用户使用错了.Qt ...

  4. iOS 9音频应用播放音频之播放控制暂停停止前进后退的设置

    iOS 9音频应用播放音频之播放控制暂停停止前进后退的设置 ios9音频应用播放控制 在“iOS 9音频应用播放音频之ios9音频基本功能”一文可以看到AVAudioPlayer类有很多的属性以及方法 ...

  5. java 线程实现、线程暂停和终止 、线程联合join、线程基本信息获取和设置、线程优先级

    转载地址:速学堂 https://www.sxt.cn/Java_jQuery_in_action/eleven-inheritthread.html 1. 通过继承Thread类实现多线程 继承Th ...

  6. Java如何检查线程是否停止?

    在Java编程中,如何检查线程是否停止? 以下示例演示如何通过使用isAlive()方法来检查线程是否已停止. // from W w w .Y I I b AI.c o M package com. ...

  7. Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? 线程的sleep()方法和yield()方法有什么区别?

    Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间 ...

  8. WPF 精修篇 长时间线程加取消功能

    原文:WPF 精修篇 长时间线程加取消功能 <Grid> <Grid.RowDefinitions> <RowDefinition Height="11*&qu ...

  9. 【多线程学习笔记整理】002_线程的停止、暂停、与yield

    一.停止线程的三种方式 停止线程是多线程中的一个很重要的点,停止线程意味着在线程处理完当前任务之前终止正在做的操作,但是如果不能正确的操作,可能会发生不可预期的结果. 1)使用退出标志,使线程正常退出 ...

随机推荐

  1. zabbix-设置邮箱预警

    设置预警系统 机器是被监控上了,但是出了问题怎么通知呢?之前学过监控软件的都知道可以使用报警机制啊,如果监控平台zabbix server发现某个机器异常了,可以给运维管理员发邮件啊,通过邮件通知管理 ...

  2. Codeforces 850C E. Arpa and a game with Mojtaba

    对每个数统计其素数因子各次方数的数,然后通过y = (x>>i) | (x&((1<<(i-1))-1)) 模拟delete x and add  to the lis ...

  3. Linux下的库文件搜索路径

        对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本configure,它的作用确定编译参数(比如头文件位置.连接库位置等),然后生成Makefile以编译程序.可以进入该软件的目录,执行 ...

  4. TLS1.3&TLS1.2形式化分析(二)

    1.下面是TLS1.2和TLS1.3握手协议过程 ,明显的可以看出存在不同 . 我们先说TLS1.2的握手过程明显是比TLS1.3的握手过多了一次.在TLS1.3中舍弃了之前RSA的协商过程,然后基于 ...

  5. linux加载字体

    将解压后的文件夹cp到/usr/share/fonts目录下,然后cd到/usr/share/fonts/ziti目录下执行:mkfontscalemkfontdirfc-cache 在linux,把 ...

  6. 移动Web前端开发 3移动web开发现状

    移动端的手机浏览器内核一般都是Webkit内核,只需要适配Webkit就可以了 适配问题 屏幕尺寸不一

  7. MySQL内存结构

    实际上MySQL内存的组成和Oracle类似,也可以分为SGA(系统全局区)和PGA(程序缓存区). mysql>show variables like "%buffer%" ...

  8. Python跨文件全局变量的使用

    尽管某些书籍上总是说避免使用全局变量,但是在实际的需求不断变化中,往往定义一个全局变量是最可靠的方法,但是又必须要避免变量名覆盖. Python 中 global 关键字可以定义一个变量为全局变量,但 ...

  9. 重构CMDB,避免运维之耻

    CMDB,几乎是每个运维人都绕不过去的字眼,但又是很多运维人的痛,因为CMDB很少有成功的,因此我也把它称之为运维人的耻辱. 那么到底错在哪儿了?该如何去重构它? 今天我想从我的角度来和大家探讨一下业 ...

  10. nginx 普通用户使用80端口启动nginx

    方法一: 依次执行如下命令 cd /usr/local/nginx/sbin/ chown root nginx chmod u+s nginx 优点是,方便简单,缺点是,既然sudo权限都不给了.这 ...