我有一个通过继承创建的线程QThread
,我调用它exec()
来启动事件循环。而这个继承的类QThread
里面有一个方法。
如何从主线程调用该方法以使其在子线程中执行?我假设该方法的执行必须在子线程的事件循环中排队,所以调用threadObject->childThreadMethod()
不是一个好主意。有什么解决办法吗?
我有一个通过继承创建的线程QThread
,我调用它exec()
来启动事件循环。而这个继承的类QThread
里面有一个方法。
如何从主线程调用该方法以使其在子线程中执行?我假设该方法的执行必须在子线程的事件循环中排队,所以调用threadObject->childThreadMethod()
不是一个好主意。有什么解决办法吗?
您不能调用线程的每个成员函数,而只能调用槽和 Q_INVOKABLE 方法。
用于QMetaObject::invokeMethod()
调用此类方法,并确保将连接类型设置为Qt::QueuedConnection
.
这样,只要控件返回到第二个线程中的事件循环,就会在第二个线程中调用该方法。调用者,即主线程,将立即继续,因此您将无法从被调用方法中获取返回值。
在幕后,QMetaObject::invokeMethod
将一个添加MetaCallEvent
到第二个线程的事件队列中。
或者,创建一个信号/插槽连接,然后在您希望在另一个线程中调用该插槽时发出一个信号。
在您可以使用的单独线程中运行某些功能QtConcurrent::run
(我将其与 一起使用QFutureWatcher
)。要每 5 秒左右运行一次,请使用QElapsedTimer
class
QFuture<void> future = QtConcurrent::run(this, &MyClass::foo2, ...foo2 arguments);
http://qt-project.org/doc/qt-4.8/qtconcurrentrun.html#run或在这里查看https://stackoverflow.com/search?q=QtConcurrent%3A%3Arun
或者你可以继承 QThread,QThread::run()
用你想在你的线程中发生的东西重新实现方法,然后创建你的线程的一个实例并在它上面调用 start()。