Таймер, подходящий для веб-игр «Клещи» - PullRequest
1 голос
/ 30 марта 2012

Я пытаюсь создать таймер для «галочки» и создал этот таймер с небольшой помощью Google.Он отлично работает в консоли, но когда я добавил его на веб-сайт, кажется, что мой компьютер работает на полную мощность, и сайт загружается медленно и не функционирует должным образом.Могу ли я использовать это или мне нужно начать заново?

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

Ответы [ 4 ]

0 голосов
/ 30 марта 2012

Я просто дам другой подход.Мне нужен был аналогичный тиковый цикл, работающий со скоростью около 25 кадров в секунду.У меня есть класс с именем ApplicationLoop, который при построении запускает поток.Этот поток - мой цикл приложения.(Отсюда и очевидное имя класса.)

Итак, у меня есть несколько констант для определения частоты кадров и запасного значения пропуска кадров.По сути, когда задача занимает больше времени, чем 40 мс (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), но помните, что время по умолчаниюсрез для сна составляет около 15 мс.

[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);
}
0 голосов
/ 30 марта 2012

Попробуйте System.Threading. Таймер Класс.

0 голосов
/ 30 марта 2012

В веб-приложениях я не рекомендую использовать статические переменные, потому что вы действительно никогда не знаете, когда ваш IIS перезапустит пул приложений, а ваша статическая переменная станет 0. Скорее, вы должны попробовать что-то для постоянного хранения.и используйте для проверки класса System.Threading.Timer, чтобы обновить значение, может быть таблица базы данных или какой-либо файл.

С уважением.

0 голосов
/ 30 марта 2012

Удалить:

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

И использовать:

System.Threading.Sleep(1000);
...