QThread:从主线程调用子线程方法

时间:2013-06-27 19:30:54

标签: multithreading qt qthread event-loop qeventloop

我有一个通过继承QThread创建的线程,我在其中调用exec()来启动事件循环。这个继承QThread的类有一个方法。

如何从主线程调用该方法以使其在子线程中执行? 我假设该方法的执行必须在子线程的事件循环中排队,因此调用threadObject->childThreadMethod()不是一个好主意。 这有什么解决方案吗?

2 个答案:

答案 0 :(得分:1)

你不能调用线程的每个成员函数,只能调用slot和Q_INVOKABLE方法。

使用QMetaObject::invokeMethod()调用此类方法,并确保将连接类型设置为Qt::QueuedConnection

这样,只要控件返回到第二个线程中的事件循环,就会在第二个线程中调用该方法。调用者,即主线程,将立即继续,因此您将无法从被调用的方法获得返回值。

在幕后,QMetaObject::invokeMethodMetaCallEvent添加到第二个线程的事件队列中。

或者,创建信号/插槽连接,然后在希望在另一个线程中调用插槽时发出信号。

答案 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()。