2017-05-31 1 views
3

更新データベース・レコードを受信することができるように20秒待ってデータベースレコードを更新します。生徒のレコードはツール(データベースに新しい学生の詳細情報を追加ツール)から追加されは、最大レコードのみ最大レコードを受信することができるように20秒待った後

イベントすなわちRecordChangedEventが送信されますと、このツールは、同時に多数のレコードを追加することができます。

注:RecordChangedEventを受信したとき、私は

レッツ新しく追加された生徒のレコードを取得するためにchanged.listの呼び出しを行う必要があり、私はツールやツールから200件のレコードを追加初めてRecordChangedEvent を送ると言いますしかし、ここでは200回のイベントを受けたいとは思っていません。むしろ私は20秒遅れて、この遅れの間に来るものは無視します。

遅延から復帰した後、changed.listを呼び出す必要があります。これは、遅延が20秒であったときに追加されたすべての新しく追加されたレコードを追加し、それらをすべて一度に追加します。

私の問題は、私は200 RecordChangedEventを取得していますし、それが(悪い)200 * 20秒遅れで表示されていることです。私はそれが遅延にあるときに、すべてのイベントを無視したいし、それが遅延した後に戻ってきたときにちょうどchanged.listから更新リストを取得以下

はあなたが必要

RecordChangedEvent(void) 
{ 
    static bool lock = false; 
    bool updateNewRecord = false; 

    // delaying for 20 sec when first event received so that max record can be received 
    if(!lock) 
    { 
     lock = true; 
     std::this_thread::sleep_for(std::chrono::seconds(20)); 
     updateNewRecord = true; 
    } 
    if(updateNewRecord) 
    { 
     // adding after 20 sec delay changed.list will have all the updated received records within 20 seconds     
     AddedRecord(changed.list);  
     lock = false; 
    } 
} 
+0

誰もがこれはまだ何も応答8日ではありません小さな例で私を助けることができます助けてください? –

答えて

0

(非効率的な)私のアプローチであります複数のスレッドはRecordChangedEventを呼び出します。あなたは一つのスレッドだけを使用している場合は、そのスレッドは、(ここで、それが再び20秒間待機します)再びRecordChangedEventを呼び出した後、次のイベントを取得し、返す前に20秒間ブロックします。したがって、最初のスレッドがスリープしている間に、イベントを処理するスレッドが少なくとも1つは必要です。

あなたが複数のスレッドを持っていたら、あなたはまだ問題に実行することができます。 lock変数はスレッドセーフではありません。 2つのスレッドが同時にロックを使用してifに入ることができるリモート可能性があります。また、あるスレッドのlockへの変更が直ちに別のスレッドに表示されるという保証はありません。代わりに、標準のロックオブジェクトを使用する必要があります。他の場所で、あなたのプログラムの中ながら

問題のもう1つの原因は、(あなたが参照によってそれを渡すとAddRecordまたはAddRecord内を通過するためにそれをコピーするか)あなたはそれから読んでいるので、ここでchanged.listのご使用は、同期していないということです別のスレッドが新しい項目をリストに追加しようとしている可能性があります。

+1

小さなexample.iを表示できますか?スレッドを作成しても問題が発生するように感じます。受信したイベントを制御できないため、一度に100または1000を超える受信が可能です。 –

関連する問題