4

問題文: カメラでオブジェクトを追跡し、それに応じてカメラを方位角と仰角で移動します。

プロセス: カメラはオブジェクトの画像を取得します....カメラの各フレームを処理してオブジェクト (追跡されるはずです...) を見つけ、各フレームで生成された情報を機械デバイス (ジンバル.. .) カメラをパンとチルトで動かすには...

設計: メインの GUI はスレッドで実行され、カメラとジンバルは他の 2 つのスレッドで実行されます...カメラ スレッドで生成された情報はジンバル スレッドに渡され、同じスレッド (カメラ スレッド...) が追跡された画像を表示します...

制約: 表示レートはジンバルの移動レートよりも高速です...したがって、各フレームで...

  1. フレームが処理されて表示されます (10 ms レートで)
  2. 生成された情報はジンバルに渡されます
  3. ジンバル スレッドはより長い時間 (100 ミリ秒) 中断され、機械部品が移動する時間を与え、移動が完了するまでジンバルに新しい更新が来ないようにします。

次の図は、Qt のクラスとシグナルおよびスロット接続の設計を示しています。

ここに画像の説明を入力

可能であれば、問題に対処するためのより良い方法を提案してください...

エラー: 時々エラーが発生します...

QObject::killTimers: タイマーは別のスレッドから停止できません

4

1 に答える 1

0

私にとっては、スレッド間でそのような関数を呼び出さないようにする必要があります。これがアイデアです。これは、大量のデータを安全に交換するための方法です。

また、両方のスレッドが共有のロック可能な変数(pingまたはpongバッファーを指すメインスレッドに使用するポインター+ロックのミューテックス)を備えたステートマシンが必要です。

このようにして、データの使用方法を変更できます。「ディスプレイ」は常に同じポインタを使用する必要があります。読み取りを開始し、その後解放すると、ロックを取得する必要があります。

カメラは他のバッファに書き込む必要がありますカメラが書き込んだ後、カメラスレッドはミューテックスのロックを取得しようとし、取得した場合(つまり、他のスレッドが他のバッファを読み取っていない場合)、カメラスレッドはメインスレッドが使用するポインタが指すバッファをロックして変更します)

このように、スレッド間の通信はなく、相互排除だけです。

最大のリスクは、カメラスレッドからロックを取得できないことです。これが解決策です->ロック時間を制限するために、各スレッドに2つ目のバッファを用意して、ロック時間を次のように短縮することをお勧めします。 「memcpy」期間。構造にブール値を追加します。これは、カメラがデータを更新したかどうかを示します。

はいの場合、メインスレッドはデータをコピーします。(そして、この間、カメラはポインターを交換できません)しかし、それが完了すると、メインスレッドもboolをfalseにリセットします。そして、このブール値がtrueに戻るまで、データをコピーするためにロックする必要はありません。(これはロックフリー交換です)これは、ブール値の読み取りがアトミックアクションであるためにのみ当てはまることに注意してください。

お役に立てば幸いです

(私の英語でごめんなさい)

于 2012-09-27T18:55:26.717 に答える