10

別のスレッドにある QObject に対して QML から QObject スロットまたは Q_INVOKABLE メソッドを呼び出す方法と、そうしても安全かどうかを判断しようとしています。

MainThread と ThreadA があるとします。QObjectA は ThreadA に存在します。QML エンジン/GUI/すべてが MainThread に存在します。を使用してQObjectAをQMLエンジンに公開します

declarativeView->setContextProperty("someObj",ObjectA)

今QMLファイルで、私は呼び出します

someObj.someMethod();

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 シグナルやスロットと同様に、さまざまな接続タイプが利用可能であることを示しています。

スレッド間で QML から C++ メソッドを呼び出すときに、Qt の qml エンジンが状況に応じて適切な型を自動的に選択するかどうかを知りたいです。

4

4 に答える 4

2

少し前に明らかになったように、QML はスレッドをまたぐことができないようです。

そのため、他のスレッドのオブジェクトへの呼び出しをディスパッチするために、メイン スレッドに存在する C++ 側の中間オブジェクトを実装する必要があります。

QML object -> object in a different thread // doesn't work!!!
QML object -> C++ mediator object -> object in a different thread // WORKS!!!

基本的に、「超越」スレッドは完全に C++ で発生する必要があるため、メディエーター オブジェクトが必要です。

于 2018-01-26T15:11:41.840 に答える
0

オブジェクトがそのスレッドに存在するため、someMethod は ThreadA で実行されると思います。

しかし、通常、これで問題が発生した場合は、次のようにします。

connect(&threadA, SIGNAL(started()), someObj, SLOT(someMethod());

しかし、その ThreadA を開始するには、QML と CPP をリンクするための CppObject がもう 1 つ必要です。

于 2012-08-21T10:31:39.787 に答える
-1

QMLロジックはイベント駆動型であり、すべての呼び出しはJavaScript関数の一部です。JS関数は、イベントハンドラー(UIイベントハンドラーなど)の場合もあれば、QScriptオブジェクトでラップした場合にC++コードのどこかで呼び出される場合もあります。また、JavaScriptWorkerTheradでそれらを呼び出すことができます。そのため、someObj.someMethod()の呼び出しが行われるのはあなただけです。

于 2012-08-21T07:33:39.873 に答える