2011-01-06 19 views
2

私はwhileループを持ち、このループではif条件があります。 しかし、条件はタイマーによって変更されます。しかし、タイマーは決してグローバル変数を変更しません。 私は理解できません。 どこに問題がありますか?System.Timerでクラスメンバー変数が変更されないのはなぜですか?

例:

bool enterHere = false; 
Timer timer = new Timer(); //Timer Started 

private void timer_Tick(object Sender, ...) 
{ 
    enterHere = true; 
} 

private void function() 
{ 
    while(...) 
    { 
     if(enterHere) 
     { 
      //Never enter here 
     } 
    } 
} 
+0

あなたは何をしようとしていますか? – Bobby

答えて

2

私はあなたがTickイベントがあなたのfunction()と同じスレッド上で実行される場合にはSystem.Windows.Forms.Timerを使用していると仮定します。あなたはダニためにタイマーを得るためにあなたのループ内

Application.DoEvents(); 

を置くことができます。または、別のスレッドで実行する別のタイマー(System.Threadingなど)を使用することもできます。

+0

ありがとうございます。簡単な答え:) – Murat

+0

これで問題は解決しましたか? –

1

WHILE(...)ループで何をやっているのですか?コード実行中にプロセッサの使用状況を確認しましたか?ループが非常に速く実行されている場合は、アプリがメッセージを処理してタイマーメッセージに反応する時間がありません。

deltremeによると、Application.DoEvents();をループに挿入すると、メッセージを処理する機会が与えられます。

0

このようなループがある場合は、タイマは別のスレッドで実行するのが理想です。タイマーは決してイベントを発生させることができません。

Alterativelyあなたは...タイマーが、それはSOの質問をするときは、必ずあなたの本当コードを投稿しなければならない理由で別の教訓として仕事

3

だ行うことができるように、DoEvents関数()を呼び出すことができ

あなたの問題に対する解決策は、他の答えが示唆しているよりもはるかに単純です。タイマのTickイベントは決して上がらないため、enterHere変数の値は決して変更されません。なぜなら、実際にはタイマを開始しないからです。具体的には、この行は正しくありません。

Timer timer = new Timer(); //Timer Started 

コンストラクタはタイマーを開始しません。 Start methodに電話する必要があります。はこれを言うdocumentation、によって確認されています

を新しいタイマーが作成されると、それが無効になっています。つまり、Enabledがfalseに設定されています。タイマーを有効にするには、Startメソッドを呼び出すか、Enabledをtrueに設定します。

Application.DoEventsのようなもので悩む理由は絶対にありません。

関連する問題