2016-08-14 26 views
3

さらに、QMetaObject::invokeMethodは、メソッド/スロットを非同期に呼び出すタイプセーフな方法です(GUIスレッドでその実行をキューに入れます)?QMetaObject :: invokeMethodの代わりにコンパイル時のチェック

QMetaObject::invokeMethodには、コンパイル時に関数名のチェックがありません。また、呼び出しごとに検索と文字列の照合が行われるため、メンバ関数を文字列で指定する際のオーバーヘッドもあります。

新しいQObject::connectの構文に類似したものがあり、コンパイル時のチェックを提供するメソッドを呼び出すのだろうかと思います。

1つの解決策は信号スロットアーキテクチャを使用していますが、これはQObjectクラスの各呼び出し元コードをラッピングしてその信号を放出できるようにします。 QEventLoopを持っている必要がありますQTimer::singleShotが呼び出されたスレッド:

+0

基本的にはhttps://bugreports.qt.io/browse/QTBUG-36861です。 – peppe

+0

@peppe:代替手段がないようです:https://bugreports.qt.io/browse/QTBUG-55304 – Isaac

+0

[this](https://stackoverflow.com/a/21653558/2666212)を見てください。したがって、 'QMetaObject :: invokeMethod(object、" method ")'の代わりに、次のようなことができます: '{QObject src; QObject :: connect(&src、&QObject :: destroyed、object、&Object :: method);} 'そのようなコンテキスト' QObject'を持つlamba関数を使うことさえできます。 。 。 – Mike

答えて

0

この目的の

QTimer::singleShot(0, object, &Object::method...); 
-- 
QTimer::singleShot(0, object, [object](){ 
    object->method(arg1, arg2, ...); 
}); 

注用QTimer :: SINGLESHOTを使用することが可能です。

+0

うん。私はMikeによって提供されたリンクでこの解決策を見てきました。このソリューションのオーバーヘッドに関するコメントは他の方法と比較してありますか? – Isaac

関連する問題