2013-05-17 3 views
0

у меня есть следующий вопрос в моем коде, у меня этот цикл работает по таймеру (это лишь малая часть из петель, которые работают на большом таймере),Как заставить таймер продолжать работать, пока цикл ждет другого результата?

внутри этого большого таймера (он галочка каждого 1 во-вторых) у меня есть 1 метод, которому нужно подождать 5 секунд, а затем продолжить с остальным кодом цикла, но я хочу, чтобы он не застрял в коде, и таймер будет продолжать работать каждые 1сек и не будет ждать этих 5 секунд.

что я сделал, добавляю новый таймер (timer_deva), который гаснет каждые 5 секунд и выполняет все проверки внутри него, а затем таймер останавливается.

поэтому моя проблема в том, что мне нужно подождать 5 секунд, чтобы получить значение для завершения моего кода, но мне нужно, чтобы мой главный таймер продолжал работать одновременно, и когда он получит свой результат в другое время, ему нужно будет завершить код, который он оставил.

спасибо заранее,

else if (mobID.Equals(Convert.ToInt32(txtDeva))) 
{ 
    //START CHECK WITH TIMER 
    timer_deva.Start(); 
    //Methods inside timer_deva update the winnerNation 
    //END CHECK TIMER - GET RESULT 
    winner(zoneId, winnerNation, humansKills, orcKills); 
} 
+0

Что должно произойти, когда таймер снова гаснет, пока он все еще ждет второго таймера?Я полагаю, вы могли бы создать новую задачу на 'timer_Tick()', которая будет ждать завершения второго таймера. Таким образом, ваш таймер не остановится, и ваша задача будет работать в другом потоке и все закончится вместе, когда отметит второй таймер. – Nolonar

+0

Вы хотите создать новый поток, чтобы вызвать timer_deva? – Dan272

+1

Я бы не создал новую нить для такого тривиального вопроса. Вместо этого используйте [Задачи] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx). Однако требуется .NET 4 или новее. Нитки очень дороги, а задачи довольно дешевы. – Nolonar

ответ

4

ТЛ; др

Обычные таймеры не используются в играх. Игры имеют совсем другой механизм для обработки их логики и времени, которое прошло.

Long Version:

Я знаю, что это не может ответить на ваш вопрос прямо, но это способ много текста судорога в комментарий. Ваши таймеры звучат очень сложно и иерархично. Из ваших имен переменных я предполагаю, что вы программируете игру. Игры обычно не работают с таймерами или нет, как вы ожидали. Это различное поведение, похожее на игру, поможет вам многое в вашей проблеме с таймерами и даже может помочь вам больше в вашем дизайне в целом.

Игры обычно имеют нечто, называемое game loop. Вообще говоря, это три основные функции, которые вызываются один за другим в цикле:

while(running) 
{ 
    HandleUserInput(); 
    ChangeWorld(); 
    Render(); 
} 

Вы получаете пользовательский ввод, изменить игровой мир, соответственно, и вы рисуете его на экран. Теперь, чем быстрее ваш компьютер, тем быстрее работает этот цикл. Это хорошо для графики (думаю, FPS), но плохо для игры. Представьте Тетрис, где каждый кадр движется. Теперь я не хочу покупать более быстрый компьютер, игра будет сложнее.

Так держать скорость игры постоянная, не зависящая от мощности компьютера, петля считает время, прошедшее:

while(running) 
{ 
    var timePassedSinceLastLoop = CalculateTimeDelta(); 

    HandleUserInput(); 
    ChangeWorld(timePassedSinceLastLoop); 
    Render(); 
} 

Теперь представьте кулдаун что-то в игре. Игрок нажал «a», произошло какое-то классное действие, и хотя он может снова нажать «a», ничего не произойдет в течение следующих 5 секунд. Но игра все еще работает и делает все, что может случиться. Это не обычный таймер. Это переменная, позволяет называть ее ActionCooldown, и как только игрок запускает действие, он устанавливается в 5 секунд. Каждый раз, когда мир меняется, timePassed вычитается из этого числа, пока оно не станет равным нулю. Все время игра работает и обрабатывает ввод и рендеринг. Но только один раз ActionCooldown достигает нуля, другое нажатие «a» снова запустит это действие.

+0

Я думаю, что лучше разместить tl; dr раздел в начале ответа. Я был удивлен, увидев его в нижней части сообщения. – Artemix

+0

Вы правы, я переместил его – nvoigt

+0

благодаря большому пониманию, я с уверенностью пойму, что в примечании к другим проектам этот проект действительно обрабатывает игру, но это не сама игра, это инструмент для дополнительного использования в игре он читает файлы журнала игр и определяет, что делать в соответствии с ним, поэтому в этом случае, если 1 условие истинно в 1 журнале, ему необходимо проверить другой журнал через 5 секунд после, затем продолжить с циклом с результатом из другой журнал, но в то же время цикл должен быть запущен для проверки других файлов журналов и так далее. – Dan272

Смежные вопросы