`
qimo601
  • 浏览: 3449014 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

QThread 线程暂停 停止功能的实现

    博客分类:
  • Qt
阅读更多

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

    }
}
 
0
0
分享到:
评论

相关推荐

    PyQt5多线程的执行和停止

    本示例主要探讨如何在PyQt5中实现多线程的执行与停止,并通过进度条进行可视化展示。下面我们将深入理解相关知识点。 首先,了解`QThread`类是关键。`QThread`是Qt提供的线程类,它允许我们把计算密集型任务放在...

    Qt之线程的开始暂停恢复停止 源码

    本教程将深入探讨如何使用Qt的`QThread`来实现线程的开始、暂停、恢复和停止功能,并结合"ThreadDemo3"源码进行详细解析。 首先,让我们理解`QThread`的基本用法。在Qt中,创建一个`QThread`对象并不意味着立即创建...

    qt利用线程实现多任务下载

    总之,这个示例展示了如何利用Qt的多线程特性实现多任务下载,结合`QThread`、`QNetworkAccessManager`以及网络协议处理,提供了续传和暂停功能,为开发者提供了一种高效、灵活的下载解决方案。通过学习和理解这个...

    12.2 Qt5多线程:使用信号量实现生产者和消费者

    6. **线程间的通信**:在生产者和消费者之间,可能还需要额外的信号和槽(signal and slot)来协调他们的操作,比如当缓冲区满时通知生产者停止生产,或者当缓冲区空时通知消费者暂停消费。 通过以上步骤,我们可以...

    QT+ffmpeg+多线程的视频播放器的代码

    实现播放、暂停、快进/后退等功能,需要对视频流进行精确的控制,例如跳过特定的视频帧或回放已解码的帧。 9. **错误处理和日志记录**: 一个良好的播放器应具备错误处理机制,当遇到无法解码的文件或者网络问题...

    QT多线程DEMO.rar

    线程暂停和恢复是通过调用QThread的pause()和resume()方法实现的。暂停线程可以使程序在某个特定时刻停止执行,然后在需要时恢复。需要注意的是,线程的暂停和恢复必须谨慎操作,避免死锁和资源泄漏。 线程挂起和...

    qt5多线程pingIP地址(线程池)

    4. **用户界面**:设计一个简洁的用户界面,允许用户输入IP地址列表,显示ping的结果,以及提供开始、暂停、停止等操作。 5. **结果解析**:fping返回的结果需要解析,提取出每个IP地址的响应时间、是否存活等信息...

    Qt的MoveToThread显示无法关闭在另一个线程的定时器

    Qt线程有两种方法:1是继承qthread; 2就是MovetoThread方法; 目的:第二种方法有其独特的用法,就是可以做成任务槽的方式,做完任务就返回,然后exec进入事件循环,可以避免单一任务频繁创建线程的开销,又可以...

    基于QT多线程下载软件的设计与实现.zip

    本项目利用QThread类创建多个线程,每个线程负责下载文件的不同部分,实现并行下载。通过这种方式,下载任务可以在多个CPU核心上同时执行,充分利用系统资源,减少等待时间。 3. 文件分块下载: 为了支持多线程...

    QT多线程简单源码学习专用注释多

    接着,当子线程暂停时,"便签变绿色并停止发送"。这表示线程状态的变化也会触发另一个信号,使得标签颜色变回绿色,并且停止数据发送。这种线程的启停机制可以通过线程的`start()`和`quit()`或`terminate()`方法来...

    QThread_02.rar

    QThread_02.rar 1. 界面上可以输入任意数,多线程中处理1到任意数的加法,每加一个数多线程等待50ms。...2. 界面上用进度条显示多线程处理进度,可以控制多线程处理进度:“开始”、“暂停”、“停止”。

    QT多线程下载工具.zip

    例如,主线程可以通过信号通知工作线程开始或停止下载,而工作线程则通过槽函数来响应这些请求。 3. **网络编程**:QT提供QNetworkAccessManager和QNetworkReply等类进行网络操作。在下载工具中,这些类用于发起...

    MultithreadedCV.tar.gz

    4. 信号和槽机制,用于在主线程和播放线程之间通信,如播放、暂停、停止等控制。 5. OpenCV的VideoCapture类,用于打开视频文件并读取帧。 6. 更新和显示视频帧的逻辑,确保在正确的线程中执行。 通过深入理解这些...

    QTextToSpeech 实现文本转语音

    如果你需要在程序运行过程中暂停或停止语音播放,可以使用`pause()`和`resume()`方法。 在描述中提到的“读取文本文件”,这通常是指从文件中读取大量文本数据,然后逐行或逐段进行语音合成。可以使用`QFile`和`...

    基于QT多任务下载功能管理.zip

    在QT中,我们可以使用QThread类来创建和管理线程,每个下载任务可以分配到一个单独的线程中运行,这样可以避免单线程阻塞导致的性能问题,实现并行下载。同时,QT的QThreadPool类提供了一个线程池的管理,允许动态...

    视频播放器-基于Qt实现

    9. **状态监控和错误处理**: 在开发过程中,我们需要监听QMediaPlayer的状态变化,如播放、暂停、停止等,以及错误信息,以确保程序的稳定性和用户体验。 10. **扩展功能**: 可以进一步增加如全屏切换、快进快退、...

    基于PyQt5实现的邮件拦截系统、视频播放器、以及pyqt5的学习笔记.zip

    QThread是PyQt5中实现多线程的主要工具。 7. 自定义部件:如果需要更复杂的UI元素,可以通过继承现有部件并重写其行为来实现。 8. 打包与部署:如何将PyQt5应用打包成可执行文件,以便在没有Python环境的机器上运行...

    QT音乐播放器

    QT的QThread类可以帮助开发者实现多线程编程,避免阻塞主线程。 9. **国际化与本地化**:QT支持国际化的字符串资源,允许开发者为不同语言的用户提供本地化的界面。 10. **软件打包与发布**:完成开发后,需要将QT...

    Qt 5+ffmpeg5.1.4实现视频播放器,含ffmpeg视频编解码源码(本地文件、http、rtsp)、项目源码+注释

    此外,Qt的QThread类可以用来实现多线程处理,确保解码和渲染工作不会阻塞UI线程,保持用户界面的响应性。 项目源码中可能包含了以下关键部分: 1. 视频播放器主界面类:定义了播放、暂停、停止等按钮,以及进度条...

    pyQt 显示两摄像头 可分别开启关闭

    7. **视频流处理**:为了实现暂停和启动功能,我们需要在每个线程中维护一个标志,当收到暂停信号时,可以停止读取视频帧;当收到启动信号时,恢复读取。此外,为了保持流畅的显示,可能还需要使用双缓冲技术,避免...

Global site tag (gtag.js) - Google Analytics