跨线程从QML调用QObject函数

Pri*_*tic 8 c++ qt multithreading qml

我正在尝试确定如何从QML中为生活在另一个线程中的QObject调用QObject槽或Q_INVOKABLE方法,以及它是否安全.

假设有一个MainThread和ThreadA.QObjectA位于ThreadA中.QML引擎/ gui/Everys都存在于MainThread中.我将QObjectA暴露给QML引擎

declarativeView->setContextProperty("someObj",ObjectA)
Run Code Online (Sandbox Code Playgroud)

现在在QML文件中,我打电话

someObj.someMethod();
Run Code Online (Sandbox Code Playgroud)

其中someMethod是一个槽或Q_INVOKABLE.我想知道哪个线程实际执行该函数.如果它是MainThread,那将是一件坏事,并且在线程之间调用这样的方法会很危险.如果它是由ThreadA执行的,那么一切都会好的.

基于此文档:http://doc.qt.nokia.com/4.7-snapshot/qtbinding.html,我假设QMetaObject ::的InvokeMethod()用于调用QObject的功能.该文档(http://doc.qt.nokia.com/4.7-snapshot/qmetaobject.html#invokeMethod),显示有可用的不同的连接类型,就像使用Qt信号和槽.

我想知道,如果Qt的QML引擎从QML跨线程调用C++方法时自动地选择合适的类型的情况,如果是这样,要求住在从QML其他线程对象的方法是可以接受的做法.

Pav*_*pov -1

QML 逻辑是事件驱动的,所有调用都是 JavaScript 函数的一部分。JS 函数可以是事件处理程序(例如 UI 事件处理程序),或者如果将它们包装在 QScript 对象中,则可以在 C++ 代码中的某个位置调用它们。您也可以在 JavaScript WorkerTherad 中调用它们。这就是为什么只有您可以提供答案, someObj.someMethod() 调用在哪里发生。

  • 我确信做出任何架构决策都不是一个好主意,这取决于框架的非文档实现细节。请自行选择合适的连接类型。 (2认同)