我的程序有问题。我将 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;
}
我认为这是对的,但是......不幸的是仍然有不止一个消息框:(
我在单例实现中做错了吗?再次感谢...!