【问题标题】:Invoking a function on a QThread that is already running在已经运行的 QThread 上调用函数
【发布时间】:2020-12-05 11:04:47
【问题描述】:

我在互联网(和 Qt 文档)上看到了很多使用 QThread 的示例,创建了该类的子类,然后将工作对象移动到该线程。然后基本上QThread::started() 信号连接到工作类对象的某个插槽以运行某个功能。 现在我想在我的项目中做同样的事情,不同的是我想将我的工作类移动到一个已经运行的线程,然后在该线程上调用一些函数。为了实现这一点,我在下面的代码中提出了一个小技巧,我使用QTimer 类来调用我的工人类中的公共槽。

    QThread myThread;
    myThread.setObjectName("myThread");
    myThread.start();

    Worker worker;
    worker.moveToThread(&myThread);

    QTimer::singleShot(0, &worker, [&worker](){
        worker.doStuff(5);
    });

有没有更惯用的方法来实现相同的目标?

【问题讨论】:

    标签: c++ multithreading qt qthread


    【解决方案1】:

    如果“doStuff”是一个槽,那么你可以使用 QMetaObject::invokeMethod:

    QMetaObject::invokeMethod(&worker, "doStuff", Qt::QueuedConnection, Q_ARG(int, 5));
    

    【讨论】:

    • 我刚刚测试了这个和这个工作(尽管语法可能会变得非常冗长,因为需要 Q_ARG 来包装参数)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    相关资源
    最近更新 更多