在已经 运行 的 QThread 上调用一个函数

Invoking a function on a QThread that is already running

我在互联网(和 Qt 文档)上看到了很多使用 QThread 的示例,制作了 class 的子 class 然后一个 worker对象被移动到那个线程。然后本质上 QThread::started() 信号连接到工人 class 对象的某个插槽,以 运行 某个函数。 现在我想在我的项目中做同样的事情,不同之处在于我想将我的工作人员 class 移动到一个已经 运行ning 的线程,然后在该线程上调用一些函数。为了实现这一点,我想出了一个小技巧,就像下面的代码一样,我使用 QTimer class 在我的 worker class.[= 中调用一个 public 插槽。 15=]

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

    Worker worker;
    worker.moveToThread(&myThread);

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

有没有更惯用的方法来实现同样的事情?

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

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