我有一个通过继承QThread
创建的线程,我在其中调用exec()
来启动事件循环。这个继承QThread
的类有一个方法。
如何从主线程调用该方法以使其在子线程中执行?
我假设该方法的执行必须在子线程的事件循环中排队,因此调用threadObject->childThreadMethod()
不是一个好主意。
这有什么解决方案吗?
答案 0 :(得分:1)
你不能调用线程的每个成员函数,只能调用slot和Q_INVOKABLE方法。
使用QMetaObject::invokeMethod()
调用此类方法,并确保将连接类型设置为Qt::QueuedConnection
。
这样,只要控件返回到第二个线程中的事件循环,就会在第二个线程中调用该方法。调用者,即主线程,将立即继续,因此您将无法从被调用的方法获得返回值。
在幕后,QMetaObject::invokeMethod
将MetaCallEvent
添加到第二个线程的事件队列中。
或者,创建信号/插槽连接,然后在希望在另一个线程中调用插槽时发出信号。
答案 1 :(得分:0)
要在单独的线程中运行某个函数,您可以使用QtConcurrent::run
(我将其与QFutureWatcher
一起使用)。要每隔5秒钟运行一次,请使用QElapsedTimer
类
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()。