计算机系统应用教程网站

网站首页 > 技术文章 正文

c++线程间回调函数 c++多线程返回值

btikc 2024-10-24 09:32:08 技术文章 7 ℃ 0 评论

在线程间进行回调可以通过信号和槽机制来实现。具体的实现方式如下:

  1. 在回调函数所在的类中声明自定义信号(在头文件中):
// MyClass.h

class MyClass : public QObject {
    Q_OBJECT
public:
    void longRunningFunction();

signals:
    void longRunningFunctionComplete(QString result);
};

这里,我们在 MyClass 类中声明了一个自定义信号 longRunningFunctionComplete,该信号将在回调完成时发射,并将回调函数的返回值作为参数传递给槽函数。

  1. 实现 longRunningFunction() 函数,该函数启动一个新线程并在该线程中执行长时间运行的任务。当任务完成并需要进行回调时,任务中发射 MyObject 的信号(在 .cpp 文件中):
// MyClass.cpp

#include <QThread>
#include "MyClass.h"

class Worker : public QObject {
    Q_OBJECT
public:
    QString result;

public slots:
    void doWork() {
        // 假设这里执行了长时间运行的任务并获得了结果
        result = "myResult";
        QMetaObject::invokeMethod(parent(), "longRunningFunctionComplete", Qt::QueuedConnection, Q_ARG(QString, result));
    }
};

void MyClass::longRunningFunction()
{
    auto worker = new Worker();
    worker->moveToThread(QThread::newThread(this));
    connect(worker, &Worker::finished, worker, &QObject::deleteLater);
    connect(this, &MyClass::startLongRunningFunction, worker, &Worker::doWork);
    connect(worker, &Worker::resultReady, this, &MyClass::handleResults);
    QThread::start();
    emit startLongRunningFunction();
}
QT开发交流+赀料君羊:661714027

注意,这里我们需要在 MyObject 类的实现中创建一个内部类 Worker,该类实现了线程中的回调函数。然后,我们将 worker 对象移到新的线程中,并使用 connect() 函数将 worker 对象的 finished() 信号连接到 deleteLater() 槽上,以确保 worker 对象被正确地销毁。接下来,我们将 MyClass 对象的 startLongRunningFunction() 信号连接到 worker 对象的 doWork() 槽上,并将 Worker 对象的 resultReady() 信号

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表