0

我的程序有问题。我将 Aforge 用于视频流,ZXing 用于 qr 代码解码部分,c# 和 windows 窗体。

我在初始化函数中为每一帧设置了事件处理程序:

videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);

在 video_newFrame 中,我有我的应用程序所需的所有代码:它获取帧,计算它,找到 QR 码,解码它,检查“某事”,然后显示一个消息框;等等每一帧。我的问题是:当我显示二维码时,程序会计算它并出现消息框(带有确定按钮,因此应该停止应用程序);如果我用二维码离开相机视野,我希望当我点击确定按钮时,它将继续在代码中,下一帧将为空(意思是没有带有二维码的纸 - 所以下一帧中没有消息框!)。但事实并非如此!大多数时候,事件处理程序已经启动了对 video_newframe 的 1-2-3 调用,这意味着我将拥有另一个 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 值是否为真,如果是,它会输入“bool value = false”(以避免下一个事件处理),它会做这些事情和 if 值为 false 它返回;然后,当它在做这些事情时,在 DialogResult 的 if 中,在“// do something”中,我再次输入了“bool = true”。对我来说没有成功。

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

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

Bartosz回答后编辑:

首先谢谢你!现在:我不知道单例或它们是什么,所以也感谢您的知识!不幸的是,问题仍然存在(可能是我的课程发展不好);我试过这个:

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

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

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

在初始化方法中我有:

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

我认为这是对的,但是......不幸的是仍然有不止一个消息框:(

我在单例实现中做错了吗?再次感谢...!

4

1 回答 1

1

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

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

于 2014-04-08T17:02:11.453 回答