2017-02-13 5 views
0

私のアプリはC#でカメラドライバのunmagedコードで呼び出されたメソッドを持っていますが、それはデリゲートを使って登録されています。私はこのメソッドが呼び出されるたびにカウントしたいと思います。アンマネージドコードコールバック - メソッドコールのカウント

サンプル:

bool firtTime; 
uint counter; 
//firtTime is reseted (set to true) in another method. 
private void MyMethod() 
{ 
    if (firtTime) 
    { 
     counter = 0; 
     firtTime = false; 
    } 

    counter++; 
    //Do stuff 
} 

は私のアプローチはOKか私はカウンターに間違った値を得ることができますか?

+1

それはインスタンスメソッドであるためInterlocked.Increment

でアトミックにする必要があるので、それはそれは同じインスタンスから呼び出された時間をカウントします。あなたが別のインスタンスを持っている場合は、カウンターが異なる – Steve

+1

なぜ静的変数をInterlocked.Incrementで使用しないのですか? – brykneval

+0

静的変数を使うことができます。ブロックする必要はありません。 – Prajwal

答えて

0

これが同時に複数のスレッドから呼び出された場合、これはOKではありません。トラブルを引き起こす可能性のある競合状態がいくつかあります。カウンタをインクリメントするには、System.Thread.Interlocked.Incrementを使用することを検討してください。

あなたはカウンターとfirtTimeの両方を保護する必要がある場合は、このような何か考えてみましょう。あなたの他のコード

+0

これはカメラドライバによって呼び出されています。私はそれが単一のスレッドであるべきだと思います。そのため、私はロックを使用していません。しかし、私は奇妙な結果を得ています。私はなぜそれを理解しようとしています。 – Pedro77

0
にカウンターとfirtTimeいじりたび{}(同期)ロックを使用してください

bool firtTime; 
uint counter; 
object sync = new object(); 
//firtTime is reseted (set to true) in another method. 
private void MyMethod() 
{ 
    lock (sync) { 
     if (firtTime) 
     { 
      counter = 0; 
      firtTime = false; 
     } 

     counter++; 
    } 
    //Do stuff 
} 

static int counter = 0; 
private void MyMethod() 
{ 
    Interlocked.Increment(ref counter); 
    //Do stuff 
} 

スタティック変数はオブジェクトではなくタイプに関連付けられています。

カウンタ++は、カウンタ=カウンタ+ 1(読み込みと書き込みの両方)に変換されます。だから、カウンター

var myCounter = counter == 0 ? 0 : (counter - 1); 
関連する問題