2012-10-19 15 views
0

嗯,我设法使用Aforge运行网络摄像头 代码可以在我自己的答案中找到。 https://stackoverflow.com/a/12966093/613326如何在使用外部引用代码时执行多线程

现在我想做一些计算机视觉相关的stuf并返回一些结果到主窗体。该线程问题我已经在这个部分从代码:然而

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(); 
} 

回答

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线程在同一线程执行。

+0

我一直对此很困惑,而且我有点惊讶你是如何解决这个问题的,并且想知道你阅读了关于线程代码的什么样的材料,有没有一本你会推荐我的书?,我是一个初学者这个。我根据MSDN代码示例编写了其他一些代码,但是我无法在这里使用它,在这种情况下,我希望更好地理解它。 – user613326

+0

@ user613326 - 我很抱歉让你失望,但我想我通过反复试验和搜索网络的方式学到了这一点。 – Enigmativity

+0

:)那么你就像我一样,我也从中学习。 – user613326

0

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

相关问题