繁体   English   中英

x秒后停止循环线程方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM