[英]How to make a countdown timer while waiting for multiple user inputs
我正在制作一个控制台数学项目,用户可以在其中回答多个数学问题。
我正在尝试添加一个倒数计时器,但我找不到如何制作一个一旦用户回答所有问题就会停止的计时器;
有谁知道如何做到这一点?
计时器、进度条和类似的东西在控制台中不能很好地工作。 这种添加在 GUI 技术中几乎是微不足道的。 但是在控制台中这样做需要跳过箍。 并且可能会进行重大的重新设计。
主要问题是您需要能够接收输入,但不会阻塞代码执行。 常规的 Console 读取方法都是阻塞到最后。 但是,有一种解决方法。 一种不阻塞地查找输入的方法:
这应该对您有所帮助。 虽然示例是 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.