网络摄像头帧事件处理程序停止和恢复c#

时间:2014-04-08 16:13:32

标签: c# winforms eventhandler

我的程序有问题。我正在使用Aforge作为视频流,ZXing用于qr代码解码部分,c#和windows表单。

我在initialize函数中为每个帧设置了事件处理程序:

videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);

在video_newFrame中我拥有我的应用程序中需要的所有代码:它需要帧,计算它,找到QR码,解码它,检查“某事”然后显示messageBox;每一帧都是如此。我的问题是:当我显示qr代码时,程序计算它并显示消息框(使用ok按钮,因此app应该停止);如果我带着qr代码离开相机视野的纸张,我期待着,当我点击确定按钮时,它将在代码中继续,下一帧将是空的(意味着没有带有qr代码的纸 - 所以在下一帧中没有消息框!)。但它不是那样的!大多数情况下,事件处理程序已经启动1-2-3调用video_newframe,这意味着我将有另一个1-2-3消息框。代码是这样的:

private void video_NewFrame2(object sender, NewFrameEventArgs eventArgs) 
{
Bitmap img = (Bitmap)eventArgs.Frame.Clone();
var result = reader.Decode(img);
if (result != null) {
    if (DialogResult.OK == MessageBox.Show("hello!"))
        // do something;
    img.Dispose(); }
}

我尝试过不同的事情:我试图在开始时取消订阅事件处理程序,并在video_newframe函数结束时再次订阅:

videoSource.NewFrame -= video_NewFrame; // at the beginning, at first line
...
videoSource.NewFrame += video_NewFrame; // in the if of the DialogResult, in the "// do something"

但没有结果。

所以我尝试使用bool值:我添加了一个if语句,检查bool值是否为true,如果是,则将“bool value = false”(以避免下一个事件处理),它会执行这些操作如果值为false,则返回;然后,当它正在做的时候,在DialogResult的if中,在“//做某事”中,我再次把“bool = true”。对我来说没有成功。

所以我的问题仍然存在:我只是希望功能始终有效;但我想,不知何故,当它找到一个结果(一个qr代码)时,它会停止触发事件,只需要显示一个消息框所需的时间;所以,例如,停止事件处理或类似的东西......

希望你能帮助我!提前致谢! :)

巴托斯回答后,

编辑

首先谢谢你!现在:我不知道单身人士或他们是什么,所以谢谢你的知识!不幸的是,问题仍然存在(可能是我在课堂上发展良好的错误);我试过这个:

public sealed class Singleton
{
    static readonly Singleton instance = new Singleton();
    static Singleton() { }
    Singleton() { }
    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
    public bool alreadyWorking;
}

然后,我做了两个测试:创建一个全局变量并使用Instance

Singleton test = Singleton.Istance; //don't know if this is good

并且在intialize方法中我有:

test.alreadyWorking = false; // global variable
Singleton.Istance.alreadyWorking = false; // istance

然后我修改了video_newframe函数,如下所示:

private void video_NewFrame2(object sender, NewFrameEventArgs eventArgs) 
{
 if (!test.alreadyWorking) // or if (!Singleton.Istance.alreadyWorking)
 {
    test.alreadyWorking = true; // or Singleton.Istance.alreadyWorking = true;

    Bitmap img = (Bitmap)eventArgs.Frame.Clone();
    var result = reader.Decode(img);
    if (result != null) {
        if (DialogResult.OK == MessageBox.Show("hello!"))
            // do something;
        img.Dispose(); 
        test.alreadyWorking = false; // or Singleton.Istance.alreadyWorking = false;
    }
 }
 else
     return;
}

并且我认为这是正确的但是......不幸的是仍然存在多个messageBox :(

我在单身实施中做错了什么?再次......!

1 个答案:

答案 0 :(得分:1)

不是取消订阅事件,而是在应用程序的某处创建一个布尔单例。在 video_NewFrame2 方法内检查单例值是true还是false。如果为true,则从方法返回;如果为false,则将其设置为true并继续执行您的工作。完成作业后,将单例值设置为false(您可以在作业完成后或在延迟一段时间后立即执行此操作)。关于如何在C#中实现单例,请参阅Google和这篇特别好的文章:

http://csharpindepth.com/Articles/General/Singleton.aspx