3

これは私のコードです:

Stopwatch timer = new Stopwatch();
timer.Start();
while (timer.ElapsedMilliseconds < 3000) {
    label1.Text = Convert.ToString( timer.ElapsedMilliseconds );
}
timer.Stop();

私の意図は、ラベルのテキストをリアルタイムで更新することでしtimer.ElapsedMilliseconds == 1350label1.Text = 1350。これどうやってするの?前もって感謝します!

4

4 に答える 4

9

これにはSystem.Windows.Forms.Timerを使用することをお勧めします。Stopwatch()

そのタイマーの精度が低くてもStopWatch(..)、適切に制御できます。

スニペットの例:

   myTimer.Tick += new EventHandler(TimerEventProcessor);       
   myTimer.Interval = 1350;
   myTimer.Start();

   private void TimerEventProcessor(...){          
     label1.Text = "...";
   }
于 2012-09-13T09:11:16.703 に答える
5

UI スレッドがそのコードを実行している間は、ペイント イベントに応答しないため、このようなタイト ループで UI を更新することはできません。「DoEvents()」のような厄介なことを行うことはできますが、しないでください...Timerタイマー イベントが発生したときに UI を定期的に更新するだけの方がよいでしょう。個人的には、50ミリ秒ごとが絶対に最速です。

于 2012-09-13T09:12:43.267 に答える
1

これは WinForms アプリですか?

問題は、ループが実行されている間、他のタスク (GUI の更新など) を実行する可能性がないため、GUI がループ全体を更新して完了することです。

ここにすばやく「ダーティ」なソリューションを追加できます (WinForms の場合)。次のようにループを変更します。

while (timer.ElapsedMilliseconds < 3000) {
  label1.Text = Convert.ToString( timer.ElapsedMilliseconds );
  Application.DoEvents();
}

これで、ループ実行の間にラベルが更新されるはずです。

于 2012-09-13T09:12:22.987 に答える
1

毎秒更新したい場合は、whileループでモジュラス演算子を使用できます。

Stopwatch timer = new Stopwatch();

timer.Start();

while (timer.ElapsedMilliseconds < 3000) {
    if (timer.ElapsedMilliseconds % 1000 == 0)
    {
        label1.Text = timer.ElapsedMilliseconds.ToString();
    }
}

timer.Stop();

モジュラス演算子は除算の余りを返します。ミリ秒が 1,000 の倍数の場合は 0 を返します。

私はおそらく使用を検討したいと思いますTimers。上記の手法を使用して多くの回転を行うと、UI が応答しなくなる可能性があります。

于 2012-09-13T09:18:33.643 に答える