qt 线程

发布于:2025-03-18 ⋅ 阅读:(12) ⋅ 点赞:(0)

以下是一个完整的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_OBJECT

public:
    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

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