【问题标题】:How to do multithreading when using outside referenced code使用外部引用代码时如何进行多线程
【发布时间】:2020-04-28 19:12:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    尝试像这样编写代码:

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

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

    【讨论】:

    • 我对此感到困惑很久了,我有点惊讶你是如何解决这个问题的,想知道你读了什么样的关于线程代码的材料,有没有一本书你会推荐我?,我我是这方面的初学者。我曾经根据 MSDN 代码示例写过其他东西,但在这种情况下我无法让它在这里工作,我想更好地理解它。
    • @user613326 - 很抱歉让你失望了,但我想我是通过反复试验和搜索网络才学会这一点的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-03-28
      • 2018-12-15
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      相关资源
      最近更新 更多