2015-08-08 3 views
2

Я создаю консольную игру так же просто, как «Я генерирую случайное число, найдите его», но со многими вариантами.Остановить метод зацикленной нити через x секунд

Мой текущий код (без того, что я хочу здесь) является availlable на GitHub: https://github.com/crakmaniaque/trouvezmoi

То, что я хочу, чтобы создать версию моей игры, которая будет приурочена, поэтому компьютер генерирует число, пользователь находит , он генерирует новый, и у игрока есть 90 секунд, чтобы найти максимальное количество случайных чисел. Я могу легко это сформулировать.

Мне нужна помощь, чтобы остановить игру (поток) через 90 секунд и получить количество ответов, основанных на потоке. Console.Title также должен показывать оставшееся время. Попытка, которую я пробовал, работает, но поток не прерывается, если консоль запрашивает ввод номера (Console.ReadLine()). Но таймер предназначен для всего процесса, а не только для ввода пользователем.

private static void timerb() 
{ 
    int t = 90; 
    for (int i = 0; i < 90; i++) 
    { 
     Console.Title = t + " seconds remaining"; 
     Thread.Sleep(1000); 
     t--; 
    } 
} 
private static void cGame() 
{ 
    Thread t = new Thread(timerb); 
    t.Start(); 
    while (t.IsAlive) 
    { 
     bool good = false; 
     int rnd = new Random().Next(0,10); // 0 and 10 are sample 
     while (!good) 
     { 
      try 
      { 
       Console.Write("Enter a number between x and y >"); 
       int i = int.Parse(Console.ReadLine()); 
       if (i == rnd) 
       { 
        good = true; 
       } 
      } 
      catch (FormatException) 
      { 
       Console.WriteLine("Invalid answer."); 
      } 
     } 
    } 
} 

Не знаю много про резьбы, и в этот момент я застрял. Может ли кто-нибудь помочь мне с моей проблемой? Я использую .NET 2.0.

+0

Возможный дубликат [Как добавить тайм-аут в Console.ReadLine()?] (Http://stackoverflow.com/questions/57615/how-to-add-a-timeout-to-console-readline) – Amit

+0

Я прочитал эту тему, и на самом деле тайм-аут здесь предназначен только для пользователя, который вменяет не весь процесс, проверку и т. Д. –

+0

Вот где у вас есть ваша проблема. Вы сами это сказали: * но поток не прерывается, если консоль запрашивает ввод номера (Console.ReadLine()) *. Используйте информацию в этом ответе, чтобы решить вашу проблему. – Amit

ответ

0

Возможно, вы ищете таймер? Вы можете зарегистрировать событие, которое будет срабатывать через 90 секунд, которое будет выполняться во время цикла. Документацию можно найти здесь: Timer class MSDN documentation.

Я считаю, что использование было бы:

Timer timer = new Timer { Interval = new Timespan (0,1,30); 
timer.elapsed += //function to fire to kill the app or the game 
+0

Я загляну в него, благодаря кучу. Я дам новости, если это сработает. –

0

You'd need to make each console read with a timeout equal to the amount of time left in the game. Это решает эту проблему.

Затем вам нужно подать сигнал, чтобы поток таймера был отключен, когда закончился основной цикл игры. Я думаю, что самым простым способом было бы закончить игровой цикл, когда оставшееся время равно < = ноль. В качестве альтернативы вы можете сделать timerb singnal основным потоком, чтобы отключиться, когда t == 0. Тем не менее, межпоточная связь всегда сложна и подвержена ошибкам.

Вы можете сигнализировать о отключении нити таймера, установив volatile bool shutdown на true и сделав timerb опросом этой переменной и закройте себя.

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