2014-03-25 3 views
0

на этот раз я пришел к вам, ребятам с просьбой о помощи с таймерами (System.Timers быть конкретными, я считаю)Невозможно создать таймер, который запускает функцию в C#

мне нужно сделать таймер, который работает функция каждый второй, до сих пор это то, что я получил:

public class Game1 : Microsoft.Xna.Framework.Game 
{ 
    Timer CooldownTracker; 

    protected override void LoadContent() 
    { 
     CooldownTracker = new Timer(); 
     CooldownTracker.Interval = 1000; 
     CooldownTracker.Start(); 
    } 

    private void DecreaseCooldown(List<Brick> bricks) 
    { 
     foreach (Brick brick in bricks) 
     { 
      if (brick.Cooldown == 0) 
       brick.Cooldown = 2; 
      else 
       brick.Cooldown--; 
     } 
    } 
} 

... Как сделать таймер запуска функции DecreasedCooldown (Список кирпича)? Я пробовал с Timer.Elapsed, но я ничего не получаю, я не могу передать аргументы таким образом. Есть идеи?

Спасибо!

+0

Возможно, вы не должны использовать таймер в XNA. Предпочтительным методом является разработка метода «Update()». В основном у вас есть поле/свойство класса, которое содержит время до запуска метода, назовем его 'timeLeft'. Каждый раз, когда вызывается 'Update()', вычтите прошедшее время (используя аргумент gameTime) из 'timeLeft'. После 'timeLeft' <= 0 вызовите метод для запуска и сброса' timeLeft'. – itsme86

ответ

2

Вы должны приложить Timer Elapsed event как:

CooldownTracker = new Timer(); 
CooldownTracker.Elapsed += CooldownTracker_Elapsed; //HERE 
CooldownTracker.Interval = 1000; 
CooldownTracker.Start();  

, а затем событие:

void CooldownTracker_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    DecreaseCooldown(yourList); 
} 
+0

Я вижу это, но как я могу отправить список функции DecreaseCooldown, если он находится внутри CooldownTracker_Elapsed? – krieg

+1

@krieg, например 'DecreaseCooldown (yourList);', замените 'yourList' именем вашей переменной. – Habib

+0

Вы можете попробовать использовать System.Threading.Timer и передать в список состояние. –

0

Вы можете использовать тему, если вы хотите. Это не так точно, возможно, причина ThreadPool, но может помочь. Как

private bool run = true; 



Thread timer = new Thread(Run); 
timer.Start(); 

и определить Run

private void Run() 
{ 
    while(run) 
    { 
     // Call function 
      Thread.Sleep(1000); //Time in millis 
    } 
} 

если вы получаете исключение кросс-нить попробуйте использовать цикл вместо Еогеасп или заблокировать ресурсы.

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