2016-10-27 4 views
0

Qtでは、複数のスレッドが 'emit'を使用して多数の信号を送信すると、トリガーが非常に遅くなります。キューイングのメカニズムがあるようです。回線上の信号スロットをすばやくトリガーする良い方法はありますか?Qtで信号スロットをすばやくトリガする良い方法はありますか?

+0

信号を送信するスレッドでスロットを呼び出すようにしますか?もしそうなら、それがスレッドセーフであることを確認して、それが呼び出すすべてのものもスレッドセーフです!特に、GUIのものはすべてメインスレッドで行わなければなりません! – hyde

答えて

1

お問い合わせの内容はQt::DirectConnectionとなります。スロットがすぐに呼び出されるようにするには、connect()に指定する必要があります。

それが使用される:シグナルが発せられる場合

スロットが直ちに呼び出されます。スロットはシグナリングスレッドで実行されます。

それ以外の場合、デフォルトのQt方法はQt::AutoConnectionと呼ばれます。

信号を送信するスレッドに受信機が存在する場合は、Qt :: DirectConnectionが使用されます。それ以外の場合は、Qt :: QueuedConnectionが使用されます。接続タイプは、信号が放射されるときに決定されます。

あなたはconnect()に接続の種類を指定することができます。

QMetaObject::Connection QObject::connect(const QObject *sender, const  
    char *signal, const QObject *receiver, const char *method,  
    Qt::ConnectionType type = Qt::AutoConnection) 

これら二つとどのように使用するhereであるとの違いについては非常に良い答えを。

+0

もちろん、スロットメソッドはスレッドセーフでなければなりません。これは、例えばGUIの更新を除外します。スレッドセーフなスロットを持つ2つの関連するクラスにロジックを分離する方が良いかもしれません。スレッドセーフなスロットに直接スレッド間接続をするのを避けるためです。 – hyde

+0

@hyde賛成ですが、スターターがスロットで何をしたいのか分かりません。彼はちょうどキューなしでスロットを呼び出す方法を尋ねています:) – demonplus

+1

ええ、TB問題はXY問題のように聞こえる... – hyde

関連する問題