AI Engineering Service

AI Engineering Serviceの公式ブログです。開発者のプライベートな内容を含みます。

【Qt5】QSignalSpyでシグナルが発行されるまで待つ

f:id:ibarakito:20190714034342p:plain

Qtでプログラムを書いていると、非同期なイベントのシグナルを待ちたい場面があります。
例えば別スレッドで画像を処理して、処理し終わるまでメインスレッドは待機したい、などですね。

こんな時はシグナルウォッチャークラスを作ってループで監視させれば良いのですが、Qtにはそのための良いクラスが用意されていました。それがQSignalSpyです。Qt5〜対応しています。早速使い方をみて行きましょう。

QSignalSpy

早速使い方を見てみましょう。
プロジェクトファイルに、

QT += testlib

と追加し、シグナル監視を始める部分で

QSignalSpy spy(myObj,SIGNAL(someSignal()));

〜do something〜

while(true){
    //シグナルを1回でも受け取っていたらループを抜ける
    if(spy.count() > 0)break;
    //1000ms待つ(その前にシグナルを受け取ったら先に進みます)
    spy.wait(1000);
}

とします。(シグナルが永遠にこないと無限ループになるので実装するときは待つ上限時間を決めるのが良いと思います)

もしくは、

QSignalSpy spy(myObj,SIGNAL(someSignal()));

〜do something〜

if(spy.count() == 0){
    //上限5000msでシグナルを待つ
    spy.wait(5000);
}

めちゃくちゃ簡単に実装できましたね。
私、長らくQt4で開発をしていたので最近になってその存在を知りました。Qtのバージョンを上げるのは腰が重かったのですが、こういう新機能があるのをみるとやはり新しい環境で開発すべきなのでしょうね。

プライバシーポリシー / お問い合わせ