0

プログラムに問題があります。ビデオ ストリームには 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;
}

私はそれが正しいと思っていましたが...残念ながらまだ複数のメッセージボックスがあります:(

シングルトンの実装で何か間違ったことをしていますか? またもや…!

4

1 に答える 1

1

イベントのサブスクライブを解除する代わりに、アプリケーションのどこかにブール値のシングルトンを作成します。video_NewFrame2メソッド内で、singletons の値が true か false かを確認します。true の場合、メソッドから戻ります。false の場合は true に設定して、ジョブを続行します。ジョブが完了したら、singletons の値を false に戻します (ジョブが完了した直後または少し遅れてから行うことができます)。C# でシングルトンを実装する方法については、Google とこの特に優れた記事を参照してください。

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

于 2014-04-08T17:02:11.453 に答える