2012-03-30 91 views
1

即時通訊嘗試創建一個計時器來「打勾」,並創建了一個有點谷歌幫助這個計時器。 它在控制檯中完美工作,但是當我將它添加到網站中時,似乎我的計算機正在全速運行,並且該站點加載速度緩慢,無法正常運行。 我可以使用這個或我需要重新開始嗎?一個適用於網頁遊戲「滴答」的計時器

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

你想達到什麼目的?你想要什麼樣的刻度? – 2012-03-30 10:12:04

+0

我想要一個計時器繼續「永遠」,並使其在一定時間後向變量添加+1。這裏我做了20秒。在「if(counttick == 20)即時將值添加到數據庫。 – 2012-03-30 10:21:11

+0

你想要做什麼,請更新客戶端? – Jodrell 2012-03-30 10:28:41

回答

0

刪除:

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

及用途:

System.Threading.Sleep(1000); 
0

在Web應用程序中,我不建議使用靜態變量,因爲你真的永遠不知道你什麼時候IIS會回收應用程序池,而你的靜態變量將變成0.你應該嘗試一些持久化存儲。並嘗試使用System.Threading.Timer類來更新值可能是數據庫表或某個文件。

問候。

0

我只是給出另一種方法。我需要一個類似的滴答循環,以每秒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()函數調用每個訂閱的函數。

您可以用一個簡單的Thread.Sleep(1)調用代替AccurateSleep()函數,但請注意,睡眠的默認時間片約爲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); 
}