0

我设法让一个网络摄像头使用 Aforge 运行。代码可以在我的回答中找到。

现在我想做一些计算机视觉的东西,并将一些结果返回到主窗体。我遇到的线程问题来自该代码的这一部分:

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

我认为您需要使用SynchronizationContext。获取 UISynchronizationContext并将上下文传递给新线程。在新线程中,当你想将结果返回给 UI 线程时,使用SendorPost方法。这SynchronizationContext实际上有助于编组对 UI 线程的调用,以便可以正确更新 UI 控件。

于 2012-10-19T05:03:08.953 回答
0

尝试像这样编写代码:

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

将委托.Invoke的执行推Action送到创建pictureBox1控件的同一线程上,换句话说,就是 UI 线程。

于 2012-10-19T05:21:50.350 回答