onlyou13

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

在Qt中创建线程去执行耗时任务,并在任务完成后通知调用方(无论成功还是失败),可以通过使用QThread和信号槽机制来实现。

以下是一个简单的示例,展示如何创建一个线程来执行任务,并在任务完成后发送信号。

步骤 1: 定义工作类

首先,定义一个工作类,该类将在单独的线程中执行任务。这个类需要继承自QObject,以便使用Qt的信号槽机制。

#include <QObject>
#include <QDebug>

class Worker : public QObject {
    Q_OBJECT

public:
    Worker() {}

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

public slots:
    void doWork() {
        try {
            // 模拟耗时任务
            qDebug() << "Task started.";
            QThread::sleep(3);  // 假设任务需要3秒钟
            qDebug() << "Task finished.";

            // 任务成功完成
            emit resultReady("Task completed successfully.");
        } catch (const std::exception &e) {
            // 任务失败
            emit failed(e.what());
        }
    }
};

 

步骤 2: 在主类中使用工作类

在主类中,创建Worker对象和QThread对象,并将Worker移动到新线程中。连接相应的信号和槽,以便在任务完成或失败时接收通知。 

#include <QCoreApplication>
#include <QThread>
#include "Worker.h"

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

    QThread workerThread;
    Worker worker;

    // 将Worker对象移动到新线程
    worker.moveToThread(&workerThread);

    // 连接信号和槽
    QObject::connect(&workerThread, &QThread::finished, &worker, &QObject::deleteLater);
    QObject::connect(&worker, &Worker::resultReady, [](const QString &result) {
        qDebug() << "Received result: " << result;
    });
    QObject::connect(&worker, &Worker::failed, [](const QString &error) {
        qDebug() << "Task failed: " << error;
    });

    // 启动线程
    workerThread.start();

    // 开始执行任务
    QMetaObject::invokeMethod(&worker, "doWork");

    // 等待线程完成
    workerThread.quit();
    workerThread.wait();

    return a.exec();
}

 

注意事项

1. 线程安全:确保你的工作类中的方法是线程安全的。 

2. 资源管理:确保线程正确地启动和结束,避免资源泄漏。 

3. 信号和槽:使用信号和槽来进行线程间的通信,避免直接操作GUI或其他非线程安全的对象。 

通过这种方式,你可以在Qt中有效地管理线程,执行耗时任务,并在任务完成后通知调用方。

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