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