控制多线程暂停、继续、退出
2023-09-14 09:07:11 时间
前提
针对继承QThread类,重写run接口方式创建的多线程
线程退出
- 对于正在运行的线程,如果想要退出,QT5提供了封装好的接口:requestInterruption和isInterruptionRequested。不再需要自定义互斥量和bool类型的退出标记。
- 退出之前调用requestInterruption,在线程内部的循环操作前判断isInterruptionRequested是否需要退出
- 不要使用terminate接口,可能会引起未知错误
- 配合调用quit和wait接口,使线程真正退出
if (pThread->isRunning())
{
pThread->requestInterruption();
pThread->quit();
pThread->wait();
}
void run()
{
while(1)
{
if (this->isInterruptionRequested())
{
return;
}
// TODO
}
}
线程暂停和继续
- 使用自定义互斥量和bool类型的暂停标记
- 定义两个互斥量,一个互斥量用于保护暂停标记,另一个用于保护具体操作
- 暂停标记的保护可以使用互斥锁简化操作
- 对外提供暂停、继续、是否暂停三个接口
- 暂停接口修改暂停标记变量,内部循环前判断暂停变量值,如果需要暂停,则QWaitCondition的wait接口阻塞线程;
- 继续接口修改暂停标记标记,同时使用QWaitCondition的wakeall接口唤醒所有等待的线程
- 是否暂停接口可以让客户端知道当前线程是否处于暂停状态。
- 暂停后如果想退出线程,必须先继续线程才能退出
void Pause()
{
QMutexLocker locker(&m_mutexPause);
m_bPaused = true;
}
void Resume()
{
QMutexLocker locker(&m_mutexPause);
m_bPaused = false;
m_WaitCondition.wakeAll();
}
bool IsPaused()
{
return m_bPaused;
}
void run()
{
while(1)
{
m_mutexRun.lock();
if (m_bPaused)
{
m_WaitCondition.wait(&m_mutexRun);
}
// TODO
m_mutexRun.unlock();
}
}
if (pThread->isRunning())
{
if (pThread->IsPaused())
{
pThread->Resume();
}
pThread->requestInterruption();
pThread->quit();
pThread->wait();
}
相关文章
- C# 控件双缓冲控制 ControlStyles 枚举详解
- Spring进阶之路(1)-Spring核心机制:依赖注入/控制反转
- Java实现 蓝桥杯VIP 算法提高 传染病控制
- SAP Spartacus b2b table,通过listService的table type字段来控制要加载的数据类型
- Android修行手册-EditText属性以及光标和小键盘控制
- 【Go基础】包、变量、函数、流程控制语句、结构体和方法
- [Unity3D]Unity3D游戏开发之使用EasyTouch虚拟摇杆控制人物移动
- 8 cocos2dx加入场景切换效果,控制场景切换彻底完毕之后再运行动画
- DML语句报错是因为控制文件无法扩大还是另有原因?
- mysql控制流程函数
- java===java基础学习(6)---流程控制,for,if,switch,continue,break
- golang_如何控制并发执行的 Goroutine 的最大数目?
- 【无人船】基于模型预测控制(MPC)对USV进行自主控制(Matlab代码实现)
- 基于MATLAB的一级倒立摆控制仿真,带GUI界面操作显示倒立摆动画,控制器控制输出
- 【跟学C++】C++控制程序流程:判断与循环(Study5)
- Binder IPC的权限控制