我的程序有问题。我正在使用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 :(
我在单身实施中做错了什么?再次......!
答案 0 :(得分:1)
不是取消订阅事件,而是在应用程序的某处创建一个布尔单例。在 video_NewFrame2 方法内检查单例值是true还是false。如果为true,则从方法返回;如果为false,则将其设置为true并继续执行您的工作。完成作业后,将单例值设置为false(您可以在作业完成后或在延迟一段时间后立即执行此操作)。关于如何在C#中实现单例,请参阅Google和这篇特别好的文章: