c#如何从多个对象中使用事件处理程序

本文关键字:事件处理 程序 对象 | 更新日期: 2023-09-27 17:52:34

很抱歉,因为我以前从未使用过事件处理程序,也不知道如何表达这个问题。我理解他们的概念。

我正在研究一个视频文件处理工具,它可以逐帧处理视频。用户选择一组视频,应用程序将运行以下代码来循环遍历它们,并触发对每个视频的处理:

foreach (string[] item in fileList)
{
    FileVideoSource videoSource;
    videoSource = new FileVideoSource(item[1]);
    videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
    videoSource.Start();
}

将处理的每个新帧定向到名为"video_NewFrame"的事件处理程序。

事件处理程序如下所示:

private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) {
    try {
        this.Invoke((MethodInvoker) delegate {
            // get new frame
            Bitmap bitmap = eventArgs.Frame;
            //Process frame code...
            pictureBox1.Image = bitmap;
            Application.DoEvents();
        });
    } catch {
        Application.Exit();
    }
}

现在fileList中将有多个需要处理的文件。(我计划将来使用线程)。

目前这段代码将一起处理所有帧,而不是单独处理每个视频。我如何分离事件处理程序单独处理对象的对象?

c#如何从多个对象中使用事件处理程序

你应该做的是创建一个类,它的构造函数接收字符串。所有类所做的就是循环体所做的,但是注册他的实例方法来处理事件。您只需要在循环体中实例化类,并在必要时将它们保留在作用域中。

class VideoProcessor
{
  private FileVideoSource videoSource;
  public VideoProcessor(string fileName)
  {
    videoSource = new FileVideoSource(fileName);        
  }
  public void Start()
  {
    videoSource.NewFrame += video_NewFrame;
    videoSource.Start();
  }
  private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
  {
  }
}