繁体   English   中英

如何在等待多个用户输入时制作倒数计时器

[英]How to make a countdown timer while waiting for multiple user inputs

我正在制作一个控制台数学项目,用户可以在其中回答多个数学问题。

我正在尝试添加一个倒数计时器,但我找不到如何制作一个一旦用户回答所有问题就会停止的计时器;

有谁知道如何做到这一点?

计时器、进度条和类似的东西在控制台中不能很好地工作。 这种添加在 GUI 技术中几乎是微不足道的。 但是在控制台中这样做需要跳过箍。 并且可能会进行重大的重新设计。

主要问题是您需要能够接收输入,但不会阻塞代码执行。 常规的 Console 读取方法都是阻塞到最后。 但是,有一种解决方法。 一种不阻塞地查找输入的方法:

https://stackoverflow.com/a/5620647/3346583

应该对您有所帮助。 虽然示例是 windows forms 应用程序,但您可以使用定时器 class 来实现您想要的。

你可以很容易地用基于System.Threading.Timer的版本替换你的Thread代码。

我在你的 GutHub 中重构了你的代码: https://github.com/CrazyDanyal1414/mathtester.git

public class RunWithTimer
{
    private DateTime _finish { get; set; }
    public bool IsTimeLeft { get=> _finish > DateTime.Now; }

    private System.Threading.Timer _timer = null;

    private void TimerCallback(object state)
    {
        string timeLeft = (_finish - DateTime.Now).ToString(@"hh\:mm\:ss");
        WriteToScreen($"Time Remaining: {timeLeft}", true);
        if (!this.IsTimeLeft)
        {
            _timer.Dispose();
        }
    }
    public RunWithTimer(int numberOfSeconds)
    {
        _finish = DateTime.Now.AddSeconds(numberOfSeconds);
        _timer = new Timer(TimerCallback, null, TimeSpan.Zero, TimeSpan.FromSeconds(1.0));
    }
    public void StopTimer(int numberOfQuestionsLeft)
    {
        if (numberOfQuestionsLeft == 0)
        {
            _timer.Dispose();
        }
    }
}

理想情况下,您的RunWithTimer将实现IDisposable ,因为它包含一个IDisposable变量。 然后,一旦问题完成,您将删除它的StopTimer代码和Dispose()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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