qt 线程

embedded/2025/3/18 19:50:00/

以下是一个完整的Qt线程池实现示例,结合任务优先级、线程安全、UI交互等高级功能,并包含异常处理机制:

 

cpp

// mytask.h
#ifndef MYTASK_H
#define MYTASK_H#include <QRunnable>
#include <QObject>
#include <QMutex>
#include <QDebug>class MyTask : public QObject, public QRunnable
{Q_OBJECT
public:explicit MyTask(const QString& data, int priority = 0) : m_data(data), m_priority(priority) {setAutoDelete(true);  // 自动内存管理[4,7](@ref)}void run() override {QMutexLocker locker(&m_mutex);  // 线程安全锁[3,10](@ref)try {// 模拟耗时操作QThread::msleep(100);// 业务处理QString result = processData();emit taskCompleted(result);  // 发送完成信号} catch (...) {qCritical() << "Task failed:" << m_data;}}// 设置优先级(0-100)void setPriority(int priority) { m_priority = qBound(0, priority, 100); }signals:void taskCompleted(const QString& result);private:QString processData() {return m_data.toUpper() + "_PROCESSED";}QString m_data;int m_priority;static QMutex m_mutex;  // 共享资源锁
};#endif // MYTASK_H
 

cpp

// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QThreadPool>
#include "mytask.h"class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void onStartTasks();void handleResult(const QString& result);private:void setupThreadPool() {// 配置线程池[1,5](@ref)QThreadPool::globalInstance()->setMaxThreadCount(QThread::idealThreadCount() * 2);QThreadPool::globalInstance()->setExpiryTimeout(30000);  // 30秒空闲回收[7](@ref)}QList<MyTask*> m_tasks;
};
#endif // MAINWINDOW_H
 

cpp

// mainwindow.cpp
#include "mainwindow.h"QMutex MyTask::m_mutex;MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{setupThreadPool();// 创建UI控件和信号连接QPushButton* btn = new QPushButton("Start Tasks", this);connect(btn, &QPushButton::clicked, this, &MainWindow::onStartTasks);
}void MainWindow::onStartTasks()
{// 清空旧任务[5](@ref)QThreadPool::globalInstance()->clear();// 创建100个任务for(int i=0; i<100; ++i){MyTask* task = new MyTask(QString("Task%1").arg(i));// 设置优先级(示例:偶数任务高优先级)task->setPriority(i%2 ? QThread::LowPriority : QThread::HighPriority);// 信号连接[4](@ref)connect(task, &MyTask::taskCompleted, this, &MainWindow::handleResult, Qt::QueuedConnection);QThreadPool::globalInstance()->start(task, task->priority());}// 动态调整线程数[2](@ref)if(QThreadPool::globalInstance()->activeThreadCount() >= QThreadPool::globalInstance()->maxThreadCount()){QThreadPool::globalInstance()->setMaxThreadCount(QThreadPool::globalInstance()->maxThreadCount() + 2);}
}void MainWindow::handleResult(const QString& result)
{qDebug() << "Processed result:" << result;// 实时监控线程池状态[7](@ref)qDebug() << "Active threads:" << QThreadPool::globalInstance()->activeThreadCount()<< "Queue size:" << QThreadPool::globalInstance()->waitingTaskCount();
}// 其他实现...

关键实现说明:

  1. 任务封装​(MyTask类)
  • 双继承QObject和QRunnable以支持信号槽

    4

  • 使用setAutoDelete(true)自动内存管理

    7

  • 内置QMutex保护共享资源

    10

  • 支持优先级设置(0-100范围)

    6

  1. 线程池配置
  • 根据CPU核心数自动设置最大线程数

    1

  • 30秒空闲线程回收策略

    7

  • 动态线程数调整机制

    2

  1. 高级功能
  • 任务优先级控制(通过start()第二个参数)

    6

  • 队列清理接口(clear())

    5

  • 实时监控接口(activeThreadCount)

    7

  • 异常处理机制(try-catch块)

    3

  1. UI交互
  • 使用QueuedConnection保证跨线程安全

    4

  • 实时更新任务状态到界面

使用建议:

  1. 大数据处理时采用分批提交(如每次提交1000个任务)

    3

  2. 文件操作任务建议设置较低优先级

    6

  3. 网络请求任务建议设置较短过期时间

    7

  4. 监控线程数避免超过idealThreadCount()*3

    1

该实现综合了Qt线程池的最佳实践

1

5

7

,通过合理的资源管理和错误处理机制,可安全应用于生产环境。开发者可根据具体业务需求调整线程池参数和任务处理逻辑。


http://www.ppmy.cn/embedded/173664.html

相关文章

三.ffmpeg对yuv的操作

一.windows 1.使用ffmpeg录制mp4视频 #获取音视频设备 ffmpeg -list_devices true -f dshow -i dummy #录制视频 ffmpeg -f dshow -i video"xxxx" -c"v libx264 -pix_fmt yuv420p output.mp4 2.将mp4转换为yuv数据 //-i&#xff1a;输入文件选项&#xff1b…

ngx_http_module_t

定义在 src\http\ngx_http_config.h typedef struct {ngx_int_t (*preconfiguration)(ngx_conf_t *cf);ngx_int_t (*postconfiguration)(ngx_conf_t *cf);void *(*create_main_conf)(ngx_conf_t *cf);char *(*init_main_conf)(ngx_conf_t *cf, void *conf);…

10、基于osg引擎生成热力图高度图实现3D热力图可视化、3D热力图实时更新(带过渡效果)

1、结果 2、完整C代码 #include <sstream> #include <iomanip> #include <iostream> #include <vector> #include <random> #include <cmath> #include <functional> #include <osgViewer/viewer> #include <osgDB/Read…

C++类对象创建全解析:从构造函数到内存管理

目录 对象的创建 对象的创建规则 对象的数据成员初始化 对象所占空间大小 总结 指针数据成员 对象的创建 在之前的 Computer 类中&#xff0c;通过自定义的公共成员函数 setBrand 和 setPrice 实现了对数据成员的初始化。实际上&#xff0c;C 为类提供了一种特殊的成员函…

Linux-数据结构-线性表-顺序表

一.数据结构的基本概念 【1】数据结构&#xff1a; 相互之间存在一种或多种特定关系的数据元素的集合。 &#xff08;1&#xff09;逻辑结构 集合&#xff0c;所有数据在同一个集合中&#xff0c;关系平等。 线性&#xff0c;数据和数据之间是一对一的关…

第十六届蓝桥杯康复训练--1

题目链接&#xff1a;92. 递归实现指数型枚举 - AcWing题库 思路&#xff1a;因为题目要求必须升序输出&#xff0c;所以在递归遍历的时候从1开始就好&#xff0c;然后遍历过的变量打个标记&#xff0c;避免重复遍历&#xff0c;到n个就输出路径上所有的数&#xff0c;需要注意…

2025系统架构师(一考就过):案例之五:典型架构、架构演化、人工智能、云计算、大数据

六、中间件技术、典型架构 ◆中间件:在一个分布式系统环境中处于操作系统和应用程序之间的软件&#xff0c;可以在不同的技术之间共享资源&#xff0c;将不同的操作系统、数据库、异构的网络环境以及若干应用结合成一个有机的协同工作整体。 ◆中间件位于客户机/服务器的操作系…

项目--五子棋(前置知识)

本项目使用的系统环境是Ubuntu20.04 环境搭建 下载工具的安装 先来补充一个小知识&#xff1a;Ubuntu系统和CentOS系统的 包管理机制不同&#xff0c;用来查询软件源的命令也不同&#xff1a; Ubuntu系统使用的是apt包管理系统&#xff1a;rpm命令主要用于基于RPM包管理的系…