qt5とopencvを使用して、qtを使用してユーザーインターフェイスを提供し、opencvで画像処理部分を実行するアプリケーションを作成します.....
これまでのところ、私のデザインは次のとおりです。
- qtメインGUIスレッドを使用して、ビデオとボタンやチェックボックスなどの標準コントロールを表示しています
- 画像をキャプチャして処理するために、QObject から派生したワーカー クラスを作成し、それをスレッドに移動しました。
- ワーカー クラス (Worker::process) で実行される関数にはブロッキング while ループがあります。
- ビデオまたはカメラからフレームをキャプチャします
- それにいくつかの処理を行います
- cv::Mat から QImage に変換します
- QImageを表示するためにメインスレッドに信号を送信します
- また、ユーザー入力を受け取るために、メインスレッドからワーカースロットへの信号の送信を使用していました
私が直面した問題は、イベント ループが while ループをブロックしているため、メイン スレッドからのシグナルがワーカーによって取り出されないことでした。
多くの検索の後、メインスレッドからの信号をワーカースロットに接続するときに Qt::DirectConnection 引数を使用するソリューションを思いつきました。当時の問題を解決したものです。
ここで、ブロッキング while ループ内に qtimer または qbasictimer を追加する必要があります...そして、タイマー スロット (qtimer の場合) と保護された timerEvent ハンドラー (qbasictimer の場合) が呼び出されることはありません。私の予感は、ループのブロッキングが原因であるということです
フォーラムで多くの検索と読み取りを行った後、何らかの形で全体的な設計が間違っている可能性があるという結論に達しました..そして、アプリケーションに機能を追加し続けると、これらの問題が表示され続けます.
現在、次の 2 つのオプションがあります。
何らかの方法でスレッドの exec() 関数をブロッキング while ループ内で呼び出します。専門家への質問は次のとおりです。「worker QObject クラス内で thread::exec() メソッドを呼び出すにはどうすればよいですか。exec() を呼び出すには、worker を実行しているスレッドへの参照が必要です」(短期的な解決策)
実装全体を変更します.....そしてここでの質問は次のとおりです:「私のオプションは何ですか.....」(長期)
私の言い回しや英語が何らかの形で問題を不明確にした場合は、お気軽に詳細をお尋ねください.....ありがとう...