2012-03-11 13 views
0

私は、文字列を検索し、三つの可能なシナリオを持っているWindowsフォームアプリケーションを作成しようとしているの前に発射される: - 待ってい タイマーが経過間隔

  • 文字列2 - 見つけ

    1. 文字列1を停止しますエルス
    2. - 私はそれを待つことが予想される時間に私の問題に遭遇していますアクションを実行し、1分

    を待ちます。これが起こると、newTimer_Tickは1秒ごとにチェックを開始します。私はそれが目立つといくつかの他のものがタイマーを無効にしようとしましたが、誰も動作するように見えませんでした。以下はコードです

    public void Action(string result) 
    { 
        if (result.Contains("string1")) 
        { 
         // Check again in 10 + x seconds 
         int n = new Random().Next(0, 5000); 
         int newtime = 10000 + n; 
         newTimer.Tick += new EventHandler(newTimer_Tick); 
         newTimer.Interval = newtime; 
         newTimer.Enabled = true; 
        } 
        else if (result.Contains("string2")) 
        { 
         // Turn off 
         newTimer.Enabled = false; 
        } 
        else 
        { 
         // Perform action and tick again in 1min + x seconds 
         action1(); 
    
         int n = new Random().Next(0, 5000); 
         int newtime = 600000 + n; 
         newTimer.Tick += new EventHandler(newTimer_Tick); 
         newTimer.Interval = newtime; 
         newTimer.Enabled = true; 
        } 
    } 
    
    private void newTimer_Tick(object sender, EventArgs e) 
    { 
        Action(result); 
    } 
    

    何が間違っていますか?

  • +0

    インターバル値は何秒ごとに発生しますか? –

    +0

    intではなく、時刻の値を表現したいときは 'TimeSpan'を使います。あなたは単位のあいまいさを避けるでしょう。(秒、ミリ秒、時間、ダニ、...?) – jv42

    答えて

    5

    たびに次の行が、呼び出されたnewTimerTickイベントハンドラの新しいインスタンスがTickイベントの呼び出しリストに追加されます。

    newTimer.Tick += new System.EventHandler(newTimer_Tick); 
    

    ので、すべての時間がタイムティックがnewTimerTickを消灯が複数回呼び出されることになり、予期しない結果が出る可能性があります。

    イベントハンドラを一度だけ設定します。コンストラクタでは分かりやすい場所になります。

    +0

    私はこれを試みましたが、複製の速度を遅くしているように見えますが、完全に停止していません。 –

    +0

    デザイナーからtimer Tickイベントハンドラをコンフィグレーションした場合、コンストラクタで明示的に行う必要はありません。これは既にInitializeComponentで行われています。 – Phil

    +0

    ええ、これは起こったようです。私は今テスト中ですが、問題がなくなった場合に助言します。 –

    0

    Timer.Stopメソッドでタイマーを停止しようとしましたか?

    Btw:毎回新しいTimerを作成しない限り、TickイベントをnewTimerから再割り当てする必要はありません。

    +2

    Startメソッドの呼び出しは、Enabledをtrueに設定するのと同じです。同様に、Stopメソッドを呼び出すことは、Enabledをfalseに設定することと同じです。 –

    +0

    @JacobSeleznev Trueそれは – Robar

    0

    あなたが欠けていたものは、実際には複数の間隔で保持しないようにするため、タイマーを止めなければならないということです。あなたは一度それを実行し、結果をチェックし、それを実行し続けるかどうかを決定したいと思うようです。コードは次のとおりです。

    public void action(string result) 
        { 
         int n = new Random().Next(0, 5000); 
         Boolean blActivateTimer = true; 
         Timer timer = new Timer(); 
         timer.Tick += timer_Tick; 
         if (!result.Contains("string1") && !result.Contains("string2")) 
         { 
          n += 600000; 
          action1(); 
         } 
         else 
         { 
          if (result.Contains("string1")) 
          { 
           n += 10000; 
          } 
          else 
          { 
           blActivateTimer = false; 
          } 
         } 
         if (blActivateTimer) 
         { 
          timer.Start(); 
         } 
        } 
        void action1() 
        { 
    
        } 
        void timer_Tick(object sender, EventArgs e) 
        { 
         Timer t = (Timer)sender; 
         t.Stop(); 
         action(result); 
        } 
    
    +0

    同じタイマーインスタンスを再利用するのではなく、新しいタイマーを作成するのとは別に、これが元のように何をしていたのか分かりません。 –

    関連する問題