2012-02-10 12 views
1

私のプログラムの中には、tanthetaという値があり、それ以降のイベントの発生時に変更を続けるイベントがあります。関数内で3秒をカウントする

問題は、この値がtanthetaの範囲内にあるかどうかを、特定の範囲の0.6 to 1.5に3秒間保持するかどうかをチェックする必要があることです。

タイマーでいくつか試してみましたが、うまくいかなかったのです。助言がありますか?

EDIT--

DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer(); 
//This event is fired automatically 32 times per second. 
private void SomeEvemt(object sender, RoutedEventArgs e) 
{ 
tantheta = ; tantheta gets a new value here through some calculation 

timer.Tick += new EventHandler(timer_Tick); 
timer.Interval = new TimeSpan(0, 0, 5); 
timer.Start(); 
//if condition to check if tantheta is within range and do something 

} 

void timer_Tick(object sender, EventArgs e) 
     { 
      DispatcherTimer thisTimer = (DispatcherTimer)sender; 
      textBox1.Text = thisTimer.Interval.ToString(); 
      thisTimer.Stop(); 
      return; 
     } 

私はtantheta値は3秒間1に0.6内にとどまるかどうかを確認する必要があります。私はタイマーは良いアプローチですが、別のスレッドに行くので、これらの計算中にアプリケーションがフリーズするのを防ぐことができます。 :/

+3

何を、具体的には、あなたがしようとしたのですか? –

+1

なぜタイマーが機能しないのですか?あなたのコードを表示することができます –

+0

投稿を編集しました – Cipher

答えて

2

あなたはあまりにも多くの時間をポーリングし、変更/変更を逃すため、タイマーは役に立たない。

変数の設定をカプセル化する必要があります。 この方法で、変数の変更に対応することができます。

class A 
{ 
    private double _tantheta; // add public getter 
    private bool _checkBoundaries; // add public getter/setter 
    public event EventHandler TanThetaWentOutOfBounds; 
    public void SetTantheta(double newValue) 
    { 
     if(_checkBoundaries && 
      (newValue < 0.6 || newValue > 1.5)) 
     { 
      var t = TanThetaWentOutOfBounds; 
      if(t != null) 
      { 
       t(this, EventArgs.Empty); 
      } 
     } 
     else 
     { 
      _tantheta = newValue; 
     } 
    } 

は、今あなたがしなければならないのは、このクラスのTanThetaWentOutOfBoundsイベントをサブスクライブし、trueまたはfalseにCheckBoundariesを設定しています。

このコードではマルチスレッドの問題は解決されないため、クラスの使用状況に応じてロックを追加する必要があることに注意してください。

3秒の期間に処理するには、2つの方法があります:前回の更新の時間を追跡した場合にのみ行動を取るTanThetaWentOutOfBoundsハンドラ(イベントのために登録するいくつかの他のクラス)で

  1. は、測定開始から3秒以内にイベントが発生します。このようにして、期間を実施する責任が消費者に与えられます。

  2. 以前にイベントが発生してからわずか3秒が経過した場合にのみ、イベントを発生させることができます。この方法で、すべての消費者をライザーで実施している期間に制限することができます。 DateTime.Nowを使って時刻を取得していますが、これはStopwatchクラスほど正確ではありません。

コード:

class A 
{ 
    private double _tantheta; // add public getter 
    private DateTime _lastRaise = DateTime.MinValue; 
    private bool _checkBoundaries; // add public getter/setter 
    public event EventHandler TanThetaWentOutOfBounds; 
    public void SetTantheta(double newValue) 
    { 
     if(_checkBoundaries && 
      (newValue < 0.6 || newValue > 1.5)) 
     { 
      var t = TanThetaWentOutOfBounds; 
      if(t != null) 
      { 
       var now = DateTime.Now; 
       if((now - _lastRaise).TotalSeconds < 3) 
       { 
        t(this, EventArgs.Empty); 
        _lastRaise = now; 
       } 
      } 
     } 
     else 
     { 
      _tantheta = newValue; 
     } 
    } 
+0

ここで3秒カウントステートメントを逃したと思います。私は3秒が経過し、tanthetaの値が境界内に残っている場合のみ、火を発射しなければならない。これはここに含めることができますか? – Cipher

+0

私は私の答えに追加しました。 –

0

私の推測では、関数が呼び出された最後の時刻を追跡する関数の外に変数が必要です。こうすることで、最後の呼び出しから3秒が経過したかどうかを確認することができます。 Timerオブジェクトは必要ありません。

+0

投稿を編集しました – Cipher

関連する問題