在已经 运行 的 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));
我在互联网(和 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));