2012-03-30 4 views
1

IMはちょっとしたタイマーを作成しようとしていて、小さなGoogleのヘルプでこのタイマーを作成しました。 これはコンソールではうまくいきますが、ウェブサイトに追加したときにコンピュータが完全に動作していて、サイトがゆっくり読み込まれていて正しく機能していないようです。 これを使うことができますか、やり直す必要はありますか?ウェブゲーム "ticks"に適したタイマー

namespace ticket 

{ 
    class Program 
    { 
     public static int counttick = 0; 
     public static int ticks = 0; 
     static void LoopingFunction() 
     { 
      while (counttick <= 20) 
      { 
       int dwStartTime = System.Environment.TickCount; 

       while (true) 
       { 

       if (System.Environment.TickCount - dwStartTime > 1000) break; //1000 milliseconds 

       } 

       counttick++; 
       if (counttick == 20) 
       { 

        ticks++; 

        counttick = 0; 
       } 
      } 
     } 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      Label2.Text = "Ticks: " + Convert.ToString(ticks); 

      LoopingFunction(); 
     } 
    } 
}` 
+0

達成したいことはありますか?どのようなティックをしたいですか? –

+0

私はタイマーを "永遠に"続けて、一定時間後に変数に+1を加えたいと思っています。ここでiveは20秒間それを作った。 in "(counttick == 20)imはデータベースに値を追加しようとしています –

+0

チックで何をしたいですか?クライアントをアップデートしますか? – Jodrell

答えて

0

削除:

while (true) 
{ 
    if (System.Environment.TickCount - dwStartTime > 1000) break; //1000 milliseconds 
} 

と使用:

System.Threading.Sleep(1000); 
0

がSystem.Threadingを試してみてください。 Timerクラス。

0

ウェブアプリケーションでは、IISがアプリケーションプールをリサイクルするときに実際に決して知ることがないので、静的変数を使用することはお勧めしません。静的変数は0になります。値を更新するためにSystem.Threading.Timerクラスを試すために使用すると、データベーステーブルまたは一部のファイルである可能性があります。

よろしくお願いいたします。

0

もう1つアプローチします。私は毎秒約25フレームで実行される同様のティックループが必要でした。私はApplicationLoopというクラスを持っています。そのスレッドは私のアプリケーションループです。 (したがって明白なクラス名です。)

私はフレームレートとフレームスキップフォールバック値を決定するためにいくつかの定数を持っています。基本的に、タスクが40ms(1000/25 = 40)以上の時間がかかると、すべてのタスクを再びキャッチアップします。しかし、私はこれを何度もやります。

private const int MAX_FRAMESKIP = 5; 
private const int UPDATE_SKIP_TICKS = 1000/UPDATE_TICKS_PER_SECOND; 
private const int UPDATE_TICKS_PER_SECOND = 25; 

マイスレッド関数:

private void UpdateLoop() 
{ 
    ulong ticks = 0UL; 
    _isRunning = true; 
    var next = DateTime.Now.Ticks/TimeSpan.TicksPerMillisecond; 

    while (_isRunning) 
    { 
     var now = DateTime.Now.Ticks/TimeSpan.TicksPerMillisecond; 
     int loops = 0; 

     while ((now > next) && _isRunning && (loops < MAX_FRAMESKIP)) 
     { 
      ProcessTasks(ticks); 

      next += UPDATE_SKIP_TICKS; 
      loops++; 
      ticks++; 
     } 

     AccurateSleep(1); 
    } 
} 

私のクラスは、デリゲートを取るSubscribe()機能が含まれています。私はそのコールバックをListに格納し、ProcessTasks()関数は各購読関数を呼び出します。

AccurateSleep()関数を単純な0​​コールで置き換えることはできますが、スリープのデフォルトのタイムスライスは約15msです。

[DllImport("winmm.dll")] 
private static extern uint timeBeginPeriod(uint period); 

[DllImport("winmm.dll")] 
private static extern uint timeEndPeriod(uint period); 

private static void AccurateSleep(int sleep) 
{ 
    timeBeginPeriod(1); 
    Thread.Sleep(sleep); 
    timeEndPeriod(1); 
} 
関連する問題