0

Aforgeを使用してWebカメラを実行することができました。コードはここの私の答えにあります

今、私はいくつかのコンピュータビジョンのことをして、いくつかの結果をメインフォームに戻したいと思います。私が抱えているスレッドの問題は、そのコードのこの部分にあります。

void FinalVideo_NewFrame(object sender, NewFrameEventArgs eventArgs)
{ Bitmap video = (Bitmap)eventArgs.Frame.Clone();
  pictureBox1.Image = video;
  // count red colors  
  // not yet written
  TextBox1.text = "demo error";  // >> i like to return a value to the main form
 }

ただし、問題は別のスレッドでビデオフレームを実行していることであり、そのスレッドからメインフォームに回答を返すことができなくなりました。私はAforgeを作成しませんでした。リンクして、フォームで機能させるだけでした。

Aforgeビデオの動作方法を変更することはできません。つまり、私がやりたいことである何かを取り戻すことは決してできなかったということです。テキストボックス内の文字列テキストのように、結果を取り戻す方法はありますか。このコードが実行されるメインフォームでは?

スレッドのサンプルコードに従うことはできますが、Aforgeでのビデオ取得の設計方法にあまり影響を与えなかったため、これは少し頭がおかしいです。

テキストボックスを更新するためだけに別のスレッドを上げることが機能するかどうか疑問に思っていましたが、最終的には多くのスレッドが作成され、カーネルの切り替え負荷が大きくなるのではないかと思います。

いくつかの追加情報:上記のコードスレッドは、以下のこのボタン関数で開始されます。

private void button1_Click(object sender, EventArgs e)
{ FinalVideo = new VideoCaptureDevice(VideoCaptureDevices[comboBox1.SelectedIndex].MonikerString);
  FinalVideo.NewFrame += new  NewFrameEventHandler(FinalVideo_NewFrame);
  FinalVideo.Start();
}
4

2 に答える 2

0

次のようにコードを書いてみてください。

void FinalVideo_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
    Bitmap video = (Bitmap)eventArgs.Frame.Clone();
    pictureBox1.Invoke((Action)(() =>
    {
        pictureBox1.Image = video;
        TextBox1.text = "demo error";
    }));
}

は、デリゲートの実行を、コントロールを作成したのと同じスレッド、つまりUIスレッドに.Invokeプッシュします。ActionpictureBox1

于 2012-10-19T05:21:50.350 に答える
0

私はあなたがSynchronizationContextを使用する必要があると思います。UISynchronizationContextを取得し、コンテキストを新しいスレッドに渡します。新しいスレッドで、結果をUIスレッドに返したい場合は、SendorPostメソッドを使用します。SynchronizationContext実際には、UIスレッドへの呼び出しをマーシャリングして、UIコントロールを適切に更新できるようにするのに役立ちます。

于 2012-10-19T05:03:08.953 に答える