0

私はプログラミングの初心者です。これは私のコードです:

private void timer1_Tick(object sender, EventArgs e)
{
    sec++;
    textBoxSeconds.Text = sec.ToString();
    if (sec > 59)
    {
        sec = 0;
        textBoxSeconds.Text = sec.ToString();
        min++;
        textBoxMinutes.Text = min.ToString();
    }
}

時間は速すぎます;/そしてそれは時々数秒間止まります。誰かが私を助けてくれることを願っています: ) *編集// *助けてくれてありがとう:)それは機能しますが、私は以前にメントンしなかった問題をまだ抱えています。時間は時々1-2秒停止します、なぜidk。おそらくいくつかのループのためですか?

4

3 に答える 3

4

これは間違ったアプローチです。プログラムが起動したら、DateTimeインスタンスを保存するだけstartTimeです。タイマーティックハンドラーで、現在の時刻と開始時刻の差を計算し、それを表示します。

private DateTime startTime = DateTime.Now;

private void timer1_Tick(object sender, EventArgs e)
{
    var delta = DateTime.Now - startTime;
    textBoxSeconds.Text = delta.Seconds.ToString("n0");
    textBoxMinutes.Text = Math.Floor(delta.TotalMinutes).ToString("n0");
}
于 2012-02-04T20:55:09.547 に答える
1

あなたのコードを使用して、私はおそらくあなたがタイマーを設定していないと言うことができますInterval、それで:

timer1.Interval = 1000; //1000 ms = 1 second

Tick次に、イベントで何かを改善できます。

private void timer1_Tick(object sender, EventArgs e)
{
    sec++;

    if (sec == 60)
    {
        sec = 0;
        min++;
    }

    textBoxSeconds.Text = sec.ToString();
    textBoxMinutes.Text = min.ToString();
}

したがって、DateTimeクラスを使用してください。これが最良のソリューションです。

編集:

    DateTime startTime = DateTime.Now;

    void timer1_Tick(object sender, EventArgs e)
    {
        TimeSpan time = DateTime.Now - startTime;
        textBoxSeconds.Text = string.Format("{0:0#}", time.Seconds);
        textBoxMinutes.Text = string.Format("{0:0#}", time.Minutes);
    }
于 2012-02-04T21:16:59.373 に答える
0

startTimeについて同意します-必須です。DataTime.UtcNowについてもコメントしました-これは正しい方法です。

1..2秒の遅れに関する2番目の問題について-これは、タイマーの目盛りが秒の目盛りと並んでいるためです。

1)タイマーが1000msではなく998msでトリガーされる場合、同じ秒数を読み取ることができ、この数値は次のティックの前に残ります。

2)アプリケーションはOSの観点からリアルタイムの優先順位ではないため、数秒間保持することができ(たとえば、他のアプリによるマルチメディアのもののレンダリングの場合)、1秒のスキップに気付くことができます...

1番目の理由を解決し、2番目の理由を容易にするために、間隔を500または333に減らして、ティック数を増やしてみてください。

リソースを保持するより高度な戦略については、1000ミリ秒を使用する必要がありますが、dateTime.Millisecondsを使用して、0.5秒ごとにタイマーを定期的に同期します。これにより、余分なティックなしでサイドバイサイドレースの問題を回避できる可能性が最大になります。

于 2013-07-14T10:59:51.487 に答える