簡體   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