QT开发中文网

跨线程调用:通过使用 QObject::invokeMethod() 函数,如何使用,举例说明

当需要在不同线程之间进行跨线程调用时,可以使用QObject::invokeMethod()函数。该函数允许你在目标对象的线程上异步调用一个方法,并将结果传递回当前线程。

下面是一个示例代码,说明如何使用QObject::invokeMethod()函数进行跨线程调用:

#include <QCoreApplication>
#include <QDebug>
#include <QThread>

class Worker : public QObject
{
    Q_OBJECT
public slots:
    void doWork()
    {
        qDebug() << "Worker running in thread:" << QThread::currentThreadId();
        QString result = "Hello from worker!";
        // 发送结果到主线程
        emit workDone(result);
    }
signals:
    void workDone(const QString& result);
};

class Manager : public QObject
{
    Q_OBJECT
public:
    Manager()
    {
        // 创建并启动子线程
        thread = new QThread();
        worker = new Worker();

        worker->moveToThread(thread);
        connect(thread, &QThread::started, worker, &Worker::doWork);

        connect(worker, &Worker::workDone, this, &Manager::handleResult);
        
        thread->start();
    }
    
    ~Manager()
    {
        thread->quit();
        thread->wait();
        
        delete thread;
    }

public slots:
    void handleResult(const QString& result)
    {
         qDebug() << "Received result in main thread:" << QThread::currentThreadId();
         qDebug() << "Result:" << result;
         
         // 可以继续在主线程中处理结果...
         // ...
         
         // 退出应用程序
         QCoreApplication::quit();
     }

private:
     QThread* thread;
     Worker* worker;
};

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    
    Manager manager;
    
    return app.exec();
}

#include "main.moc"

在上面的示例中,Worker类代表一个工作线程,它会在其所属的子线程中执行耗时操作,并通过信号workDone发送结果给主线程。Manager类则负责创建并管理子线程以及处理结果。

当主程序运行时,会创建一个Manager对象,该对象会启动子线程并将工作交给 Worker 对象来完成。然后,在主线程中接收到 workDone 信号后,调用 handleResult() 方法进行结果处理。

通过使用 QObject::invokeMethod() 函数以及信号和槽机制,我们可以方便地在不同线程之间进行通信和协调。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=10109

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?