web-dev-qa-db-ja.com

C#カウントダウンタイマー

C#を使用してカウントダウンを作成し、時刻を次の形式で表示しようとしています。

hour:minutes:seconds

私はこれを試しました:

 var minutes = 3; //countdown time
  var start = DateTime.Now;
  var end = DateTime.Now.AddMinutes(minutes);
  Thread.Sleep(1800);
  if (??) // I tried DateTime.Now > end not works
  {
       //... show time
      label1.Text = "..."; 
  } 
  else 
  {
     //done 
      label1.Text = "Done!"; 
  }

この問題を解決するさまざまな方法も登場しました。前もって感謝します

11
The Mask

ここではThread.Sleepを使用しないでください。 UIスレッドのThread.SleepはUIをブロックし、別のスレッドでそれを使用すると、スレッドの同期によりさらに複雑になります。

C#5または非同期CTPを使用している場合は、UIをブロックしないThread.Sleepに相当する継続ベースのコードを取得できるため、おそらく、実行したコードと非常によく似たコードを記述できます。

標準のC#4では、 System.Windows.Forms.Timer を使用します。

カウントダウンを開始するには:

var minutes = 3; //countdown time
var start = DateTime.UtcNow; // Use UtcNow instead of Now
endTime = start.AddMinutes(minutes); //endTime is a member, not a local variable
timer1.Enabled = true;

タイマーハンドラーで次のように記述します。

TimeSpan remainingTime=endTime-DateTime.UtcNow;
if(remainingTime<TimeSpan.Zero)
{
   label1.Text = "Done!";
   timer1.Enabled=false; 
}
else
{
  label1.Text = remainingTime.ToString();
}

その他のフォーマットオプションについては、 標準TimeSpanフォーマット文字列 を参照してください。

このコードに残っている問題の1つは、システムクロックが変更された場合に正しく機能しないことです。

DateTime.Nowの代わりにDateTime.UtcNowを使用すると、夏時間への切り替えやタイムゾーンの変更時にも機能しなくなります。 (表示時間ではなく)特定の時点を識別したいので、現地時間の代わりにUTCを使用する必要があります。

29
CodesInChaos

私はこのようなタイマーを使用します。最初にいくつかのインスタンス変数。

private int _countDown = 30; // Seconds
private Timer _timer;

コンストラクターまたはロードイベントで

_timer = new Timer();
_timer.Tick += new EventHandler(timer_Tick);
_timer.Interval = 1000;
_timer.Start();

そして最後にイベントハンドラー

void timer_Tick(object sender, EventArgs e)
{
    _countDown--;
    if (_countDown < 1)
    {
        _countDown = 30;
    }
    lblCountDown.Text = _countDown.ToString();
}
6
Jonas Elfström

コードで変数を設定してから3分間スリープ状態になるため、ifステートメントはスリープ状態を終了するまで実行されません。 UIを更新するために新しいスレッドを設定するか、次のようなことを行います...

while (DateTime.now < end) {
  label1.Text = "...";
  Thread.Sleep(#); //Pick a second, or 5 or whatever
}

label1.Text = "Done!";

2番目のスレッドを使用すると、プログラムが機能している間もプログラムで何かを行うことができます。 「やった!」終了すると表示されます。

0
Grambot

Timerを使用することもできます。これにより、UIロックなどのすべての問題が処理されます。 System.Windows.Forms.Timer-タイマーを使用できます。 MSDNライブラリには、その使用例があります。

WinForms-Timerは、TimerスレッドとUIスレッド全体の呼び出しも処理します。

-SeriTools

0
seri