2012-03-30 3 views
1

메신저가 "tick"할 타이머를 만들려고 시도하고 작은 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 초 동안 그것을 만들었다. "에서 (counttick == 20) 데이터베이스에 값을 추가하려고 할 때 –

+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

다른 접근 방식을 사용합니다. 초당 약 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() 함수를 간단한 Thread.Sleep(1) 호출로 바꿀 수 있지만 수면의 기본 타임 슬라이스는 약 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); 
} 
관련 문제