プログラムに問題があります。ビデオ ストリームには Aforge、qr コードのデコード部分には ZXing、c# と Windows フォームを使用しています。
初期化関数で、各フレームのイベント ハンドラーを設定しました。
videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
video_newFrame には、アプリケーションに必要なすべてのコードがあります。フレームを取得し、計算し、QR コードを見つけてデコードし、「何か」をチェックして、メッセージ ボックスを表示します。など、フレームごとに。私の問題は次のとおりです。qrコードを表示すると、プログラムがそれを計算し、メッセージボックスが表示されます([OK]ボタンが付いているため、アプリを停止する必要があります)。カメラの視野から QR コードの付いた紙を取り出した場合、[OK] ボタンをクリックすると、コードが続き、次のフレームが空になることを期待しています (つまり、 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値を試してみました:私はbool値がtrueかどうかをチェックするifステートメントを追加し、そうであれば、それは「bool value = false」を置きます(次のイベント処理を避けるために)、それはものを行い、if値false は返します。次に、DialogResultのifで、「//何かをする」で、「bool = true」をもう一度入れました。私にとっては成功しません。
だから私の問題はまだそこに残っています.私は関数が常に機能することを望んでいます; しかし、どういうわけか、結果 (qr コード) が見つかったときに、メッセージボックスを 1 つだけ表示するのに必要な時間だけ、イベントの発生を停止する必要があります。たとえば、イベント処理などを停止します...
あなたが私を助けてくれることを願っています!前もって感謝します!:)
Bartoszの回答後に編集:
まず、ありがとう!今:私はシングルトンやそれらが何であるかを知らなかったので、知識にも感謝します! 残念ながら、問題はまだ残っています (おそらく、クラスをうまく開発できなかったのは私のせいです)。私はこれを試しました:
public sealed class Singleton
{
static readonly Singleton instance = new Singleton();
static Singleton() { }
Singleton() { }
public static Singleton Instance
{
get
{
return instance;
}
}
public bool alreadyWorking;
}
次に、2 つのテストを行いました。グローバル変数を作成し、インスタンスを使用します。
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;
}
私はそれが正しいと思っていましたが...残念ながらまだ複数のメッセージボックスがあります:(
シングルトンの実装で何か間違ったことをしていますか? またもや…!