为了实现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重建线程";
}
}
分享到:
相关推荐
本示例主要探讨如何在PyQt5中实现多线程的执行与停止,并通过进度条进行可视化展示。下面我们将深入理解相关知识点。 首先,了解`QThread`类是关键。`QThread`是Qt提供的线程类,它允许我们把计算密集型任务放在...
本教程将深入探讨如何使用Qt的`QThread`来实现线程的开始、暂停、恢复和停止功能,并结合"ThreadDemo3"源码进行详细解析。 首先,让我们理解`QThread`的基本用法。在Qt中,创建一个`QThread`对象并不意味着立即创建...
总之,这个示例展示了如何利用Qt的多线程特性实现多任务下载,结合`QThread`、`QNetworkAccessManager`以及网络协议处理,提供了续传和暂停功能,为开发者提供了一种高效、灵活的下载解决方案。通过学习和理解这个...
6. **线程间的通信**:在生产者和消费者之间,可能还需要额外的信号和槽(signal and slot)来协调他们的操作,比如当缓冲区满时通知生产者停止生产,或者当缓冲区空时通知消费者暂停消费。 通过以上步骤,我们可以...
实现播放、暂停、快进/后退等功能,需要对视频流进行精确的控制,例如跳过特定的视频帧或回放已解码的帧。 9. **错误处理和日志记录**: 一个良好的播放器应具备错误处理机制,当遇到无法解码的文件或者网络问题...
线程暂停和恢复是通过调用QThread的pause()和resume()方法实现的。暂停线程可以使程序在某个特定时刻停止执行,然后在需要时恢复。需要注意的是,线程的暂停和恢复必须谨慎操作,避免死锁和资源泄漏。 线程挂起和...
4. **用户界面**:设计一个简洁的用户界面,允许用户输入IP地址列表,显示ping的结果,以及提供开始、暂停、停止等操作。 5. **结果解析**:fping返回的结果需要解析,提取出每个IP地址的响应时间、是否存活等信息...
Qt线程有两种方法:1是继承qthread; 2就是MovetoThread方法; 目的:第二种方法有其独特的用法,就是可以做成任务槽的方式,做完任务就返回,然后exec进入事件循环,可以避免单一任务频繁创建线程的开销,又可以...
本项目利用QThread类创建多个线程,每个线程负责下载文件的不同部分,实现并行下载。通过这种方式,下载任务可以在多个CPU核心上同时执行,充分利用系统资源,减少等待时间。 3. 文件分块下载: 为了支持多线程...
接着,当子线程暂停时,"便签变绿色并停止发送"。这表示线程状态的变化也会触发另一个信号,使得标签颜色变回绿色,并且停止数据发送。这种线程的启停机制可以通过线程的`start()`和`quit()`或`terminate()`方法来...
QThread_02.rar 1. 界面上可以输入任意数,多线程中处理1到任意数的加法,每加一个数多线程等待50ms。...2. 界面上用进度条显示多线程处理进度,可以控制多线程处理进度:“开始”、“暂停”、“停止”。
例如,主线程可以通过信号通知工作线程开始或停止下载,而工作线程则通过槽函数来响应这些请求。 3. **网络编程**:QT提供QNetworkAccessManager和QNetworkReply等类进行网络操作。在下载工具中,这些类用于发起...
4. 信号和槽机制,用于在主线程和播放线程之间通信,如播放、暂停、停止等控制。 5. OpenCV的VideoCapture类,用于打开视频文件并读取帧。 6. 更新和显示视频帧的逻辑,确保在正确的线程中执行。 通过深入理解这些...
如果你需要在程序运行过程中暂停或停止语音播放,可以使用`pause()`和`resume()`方法。 在描述中提到的“读取文本文件”,这通常是指从文件中读取大量文本数据,然后逐行或逐段进行语音合成。可以使用`QFile`和`...
在QT中,我们可以使用QThread类来创建和管理线程,每个下载任务可以分配到一个单独的线程中运行,这样可以避免单线程阻塞导致的性能问题,实现并行下载。同时,QT的QThreadPool类提供了一个线程池的管理,允许动态...
9. **状态监控和错误处理**: 在开发过程中,我们需要监听QMediaPlayer的状态变化,如播放、暂停、停止等,以及错误信息,以确保程序的稳定性和用户体验。 10. **扩展功能**: 可以进一步增加如全屏切换、快进快退、...
QThread是PyQt5中实现多线程的主要工具。 7. 自定义部件:如果需要更复杂的UI元素,可以通过继承现有部件并重写其行为来实现。 8. 打包与部署:如何将PyQt5应用打包成可执行文件,以便在没有Python环境的机器上运行...
QT的QThread类可以帮助开发者实现多线程编程,避免阻塞主线程。 9. **国际化与本地化**:QT支持国际化的字符串资源,允许开发者为不同语言的用户提供本地化的界面。 10. **软件打包与发布**:完成开发后,需要将QT...
此外,Qt的QThread类可以用来实现多线程处理,确保解码和渲染工作不会阻塞UI线程,保持用户界面的响应性。 项目源码中可能包含了以下关键部分: 1. 视频播放器主界面类:定义了播放、暂停、停止等按钮,以及进度条...
7. **视频流处理**:为了实现暂停和启动功能,我们需要在每个线程中维护一个标志,当收到暂停信号时,可以停止读取视频帧;当收到启动信号时,恢复读取。此外,为了保持流畅的显示,可能还需要使用双缓冲技术,避免...