2012-03-30 14 views
1

Ich versuche, einen Timer zum "ticken" zu erstellen und erstellt diesen Timer mit ein wenig Google-Hilfe. Es funktioniert perfekt in der Konsole, aber wenn ich es in einer Website hinzugefügt habe, scheint es, dass mein Computer mit voller Kapazität läuft, und die Seite wird langsam geladen und funktioniert nicht richtig. Kann ich das verwenden oder muss ich neu beginnen?Ein Timer für Webgame "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

was möchten Sie erreichen? Welche Art von Ticks willst du? –

+0

Ich möchte, dass ein Timer "für immer" weiterläuft und nach einer bestimmten Zeit +1 zu einer Variablen hinzufügt. Hier habe ich es für 20 Sekunden gemacht. in "if (counttick == 20) Ich werde Werte zur Datenbank hinzufügen. –

+0

Was möchten Sie tun, um den Client zu aktualisieren? – Jodrell

Antwort

0

Entfernen:

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

und Verwendung:

System.Threading.Sleep(1000); 
0

In Web-Anwendungen empfehle ich nicht statische Variablen zu verwenden, weil Sie wirklich nie wissen, wenn IIS den App-Pool recyceln wird und Sie statische varitable werden 0. lieber sollten Sie etwas zu Persistenz Speicher versuchen. und verwenden Sie zum Testen der System.Threading.Timer-Klasse, um den Wert in einer Datenbanktabelle oder einer Datei zu aktualisieren.

Grüße.

0

Ich werde nur einen anderen Ansatz geben. Ich brauchte eine ähnliche Tick-Schleife, die bei etwa 25 Bildern pro Sekunde läuft. Ich habe eine Klasse mit dem Namen ApplicationLoop, die beim Erstellen einen Thread startet. Dieser Thread ist meine Anwendungsschleife. (Daher der offensichtliche Klassenname.)

Also habe ich ein paar Konstanten, um meine Bildrate zu bestimmen, und einen Frame-Skip-Fallback-Wert. Wenn eine Aufgabe länger als 40 ms dauert (1000/25 = 40), wiederhole ich im Grunde alle Aufgaben erneut, um "aufholen" zu können. Aber ich mache das nur einige Male.

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; 

My Thread-Funktion:

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); 
    } 
} 

My Klasse enthält eine Subscribe() Funktion, die einen Delegierten dauert. Ich speichere diesen Rückruf in eine List und die ProcessTasks() Funktion ruft jede abonnierte Funktion auf.

Sie können die AccurateSleep() Funktion durch einen einfachen Thread.Sleep(1) Aufruf ersetzen, aber beachten Sie, dass die Standardzeitscheibe für einen Schlaf ca. 15ms ist.

[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); 
}