0

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

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

4

2 回答 2

1

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

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

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

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

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

于 2013-06-27T20:05:16.783 回答
0

在您可以使用的单独线程中运行某些功能QtConcurrent::run(我将其与 一起使用QFutureWatcher)。要每 5 秒左右运行一次,请使用QElapsedTimerclass

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

于 2013-06-27T19:45:39.863 回答