Qt 程序有一个任务队列,需要在工作线程中执行,每次任务通过startTask即可,此时任务未开始状态,同1时间最多只能开启两个任务,任务可能中途失败。任务完成100%后有限完成 未开始过的第一个任务。请给出源码

时间: 2023-06-19 11:10:53 浏览: 48
以下是一个简单的示例代码,实现了任务队列的限制和失败重试功能: ```cpp #include <QThread> #include <QMutex> #include <QWaitCondition> #include <QQueue> class Task : public QObject { Q_OBJECT public: enum Status { NotStarted, Running, Failed, Succeeded }; Task(QObject *parent = nullptr) : QObject(parent), m_status(NotStarted) {} virtual void run() = 0; Status status() const { return m_status; } signals: void started(); void failed(); void succeeded(); protected: void setStatus(Status status) { m_status = status; } private: Status m_status; }; class WorkerThread : public QThread { Q_OBJECT public: WorkerThread(QObject *parent = nullptr) : QThread(parent), m_runningTasks(0) {} void addTask(Task *task) { QMutexLocker locker(&m_mutex); m_tasks.enqueue(task); m_condition.wakeAll(); } void stop() { QMutexLocker locker(&m_mutex); m_stop = true; m_condition.wakeAll(); } signals: void taskStarted(Task *task); void taskFailed(Task *task); void taskSucceeded(Task *task); protected: void run() override { forever { Task *task = nullptr; { QMutexLocker locker(&m_mutex); while (m_tasks.isEmpty() && !m_stop) { m_condition.wait(&m_mutex); } if (m_stop) { break; } if (m_runningTasks >= 2) { continue; } task = m_tasks.dequeue(); m_runningTasks++; } emit taskStarted(task); task->run(); if (task->status() == Task::Failed) { emit taskFailed(task); // Retry the task task->run(); } else { emit taskSucceeded(task); } { QMutexLocker locker(&m_mutex); m_runningTasks--; if (task->status() == Task::NotStarted) { // Complete the first unstarted task if (!m_tasks.isEmpty()) { task = m_tasks.dequeue(); m_runningTasks++; locker.unlock(); emit taskStarted(task); task->run(); if (task->status() == Task::Failed) { emit taskFailed(task); } else { emit taskSucceeded(task); } } } } } } private: QMutex m_mutex; QWaitCondition m_condition; QQueue<Task*> m_tasks; bool m_stop = false; int m_runningTasks; }; ``` 使用时,可以继承 `Task` 类来实现具体的任务,例如: ```cpp class MyTask : public Task { public: void run() override { setStatus(Running); // Do some work... if (qrand() % 2 == 0) { setStatus(Succeeded); } else { setStatus(Failed); } } }; ``` 然后在主线程中创建一个 `WorkerThread` 对象,并调用 `addTask` 方法添加任务: ```cpp WorkerThread *workerThread = new WorkerThread(this); workerThread->start(); MyTask *task1 = new MyTask(this); MyTask *task2 = new MyTask(this); MyTask *task3 = new MyTask(this); workerThread->addTask(task1); workerThread->addTask(task2); workerThread->addTask(task3); ``` 最后,记得在程序退出时调用 `stop` 方法停止工作线程: ```cpp workerThread->stop(); workerThread->wait(); ```

相关推荐

最新推荐

recommend-type

Qt图形图像开发之曲线图表模块QChart库一个chart中显示两条曲线详细方法与实例

主要介绍了Qt图形图像开发之曲线图表模块QChart库一个chart中显示两条曲线详细方法与实例,需要的朋友可以参考下
recommend-type

Qt程序中调用C#编写的dll(推荐)

主要介绍了Qt程序中调用C#编写的dll,本文图文并茂给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

Qt基础开发之Qt多线程类QThread与Qt定时器类QTimer的详细方法与实例

Qt中使用QThread来管理线程,一个QThread对象,就是一个线程。QThread对象也有消息循序exec&#40;&#41;函数,用来处理自己这个线程的事件。 Qt实现多线程有两种方式 ​1、Qt第一种创建线程方式 首先要继承QThread ...
recommend-type

交叉编译qt库并在树莓派上运行qt程序

在window下编写qt程序(helloworld.pro),在linux下编译helloworld.pro,生成可执行文件并上传至树莓派上运行
recommend-type

解决Ubuntu下使用linuxdeployqt打包Qt程序问题

主要介绍了解决Ubuntu下使用linuxdeployqt打包Qt程序问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

HSV转为RGB的计算公式

HSV (Hue, Saturation, Value) 和 RGB (Red, Green, Blue) 是两种表示颜色的方式。下面是将 HSV 转换为 RGB 的计算公式: 1. 将 HSV 中的 S 和 V 值除以 100,得到范围在 0~1 之间的值。 2. 计算色相 H 在 RGB 中的值。如果 H 的范围在 0~60 或者 300~360 之间,则 R = V,G = (H/60)×V,B = 0。如果 H 的范围在 60~120 之间,则 R = ((120-H)/60)×V,G = V,B = 0。如果 H 的范围在 120~180 之间,则 R = 0,G = V,B =
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。