[英]Stop a looped thread method after x seconds
我正在创建一个控制台游戏,就像“我生成一个随机数,找到它”一样简单,但是有很多选择。
我当前的代码(这里没有我想要的)可以在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。
也许您正在寻找计时器? 您可以注册一个事件,该事件将在90秒后触发,并在循环发生时运行。 该文档可以在这里找到: 计时器类MSDN文档 。
我相信用法是:
Timer timer = new Timer { Interval = new Timespan (0,1,30);
timer.elapsed += //function to fire to kill the app or the game
您需要使每个控制台读取的超时时间等于游戏中剩余的时间。 那解决了那个问题。
然后,您需要一种在主游戏循环结束时向Timerb线程发出信号的方法。 我认为最简单的方法是在剩余时间<=零时结束游戏循环。 或者,您可以使timerb信号作为t == 0
时关闭的主线程。 但是,线程间通信总是很复杂且容易出错。
您可以通过将volatile bool shutdown
设置为true
并通过使timerb
轮询该变量并自行关闭来向timerb线程发出关闭信号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.