onlyou13

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在Qt中,从QThread派生一个子类并在构造函数中传入需要执行的方法,然后在线程中运行该方法并通知执行结果,

是一种常见的多线程处理模式。以下是如何实现这一功能的步骤和示例代码: 

步骤 1: 定义线程类

 首先,定义一个从QThread派生的线程类。在这个类中,你可以定义一个函数指针或者使用std::function来存储传入的方法。
使用信号来通知任务的完成或失败。
 
#include <QThread>
#include <functional>
#include <QDebug>

class TaskThread : public QThread {
    Q_OBJECT

public:
    using TaskFunction = std::function<void()>;

    TaskThread(TaskFunction task, QObject *parent = nullptr)
        : QThread(parent), task_(task) {}

signals:
    void resultReady(const QString &result);
    void failed(const QString &error);

protected:
    void run() override {
        try {
            if (task_) {
                task_();  // 执行传入的任务
                emit resultReady("Task completed successfully.");
            }
        } catch (const std::exception &e) {
            emit failed(e.what());
        }
    }

private:
    TaskFunction task_;
};

 

步骤 2: 使用线程类

 在主函数或其他适当的位置创建TaskThread的实例,传入需要执行的任务。连接信号到适当的槽以处理任务完成和失败的通知。
#include <QCoreApplication>
#include "TaskThread.h"

void myTask() {
    qDebug() << "Running task...";
    QThread::sleep(2);  // 模拟耗时操作
    qDebug() << "Task completed.";
}

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    TaskThread *thread = new TaskThread(myTask);
    QObject::connect(thread, &TaskThread::resultReady, [](const QString &result) {
        qDebug() << result;
    });
    QObject::connect(thread, &TaskThread::failed, [](const QString &error) {
        qDebug() << "Error: " << error;
    });
    QObject::connect(thread, &TaskThread::finished, thread, &QObject::deleteLater);

    thread->start();

    return app.exec();
}

 如果以上TaskThread需要传入一个成员函数,需要有所改动。

因为成员函数和普通函数有所不同,无法直接传递给接受函数指针的地方。

要解决这个问题,您可以使用std::functionstd::bind来包装成员函数。以下是修改后的代码示例:

    std::function<void()> taskWrapper = std::bind(&QtMVPStudentTest::MyBusyTask, this);

    WorkThread* thread = new WorkThread(taskWrapper);

 

注意事项 

1. 线程安全:确保传入TaskThread的任务是线程安全的。 

2. 资源管理:使用QObject::deleteLater确保线程对象在完成后被正确删除。 

3. 错误处理:在run方法中使用try-catch块来捕获并处理任务中可能抛出的异常。 

通过这种方式,你可以灵活地在Qt中使用线程来执行任何指定的任务,并在任务完成时通过信号通知调用方。这种模式使得线程的使用更加灵活和安全。

posted on 2024-05-23 21:55  onlyou13  阅读(65)  评论(0编辑  收藏  举报