4

Windowsフォームタイマーに少し問題があります。それは非常に基本的な質問ですが、私は周りを見回して答えを見つけることができないようです(私はおそらく平手打ちに値します)。

タイマーの経過時間が500msの間隔よりも大きいかどうかに関係なく、タイマーの値を取得できる必要があります。

何かのようなもの

Timer.Elapsed >= 500
4

7 に答える 7

15

Timer.Elapsed「経過時間」を返すプロパティではありません-それはあなたが購読しているイベントです。アイデアは、イベントが頻繁に発生するということです。

あなたが欲しいのかどうかは本当にはっきりしていませんTimer-おそらくSystem.Diagnostics.Stopwatchあなたが本当に求めているのは何ですか?

var stopwatch = Stopwatch.StartNew();
// Do some work here

if (stopwatch.ElapsedMilliseconds >= 500)
{
    ...
}
于 2013-03-20T20:27:46.927 に答える
4

タイマーの経過時間が500msの間隔よりも大きいかどうかに関係なく、タイマーの値を取得できる必要があります。

タイマーは、経過時間を確認できるインターフェイスを提供しません。彼らがする唯一のことは、彼らが期限切れになったときにイベントを発生させることです。

Stopwatchクラスなど、他のメカニズムを使用して時間の経過を記録する必要があります。

于 2013-03-20T20:27:35.300 に答える
2

TimerのIntervalプロパティをトリガーするミリ秒数(この例では500)に設定し、Tickイベントのイベントハンドラーを追加します。

于 2013-03-20T20:30:08.347 に答える
0

私はこれをすばやく書きました、いくつかのバグがあるかもしれませんが、あなたに一般的な考えを与えます

Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 500;
timer.Elapsed += (s,a) => {
  MyFunction();
  timer.Stop();
}
timer.Start();
于 2013-03-20T20:38:44.540 に答える
0

でそれを行うことはできませんTimerElapsed0に達したときにトリガーされるイベントです。

イベントの経過時にリッスンしたい場合は、リッスンを登録してくださいElapsedInterval待機時間を設定するメンバーです。

ここを参照してください:http: //msdn.microsoft.com/en-us/library/system.timers.timer (v = vs.100).aspx

于 2013-03-20T20:28:14.357 に答える
0

ここStopwatchでのvsに関するDavidとの話し合いに基づいてDateTime、残り時間を取得する必要がある場合に2つのアプローチ(非常に単純化)を投稿することにしました。これにより、どちらが自分に適しているかを判断できます。

public partial class FormWithStopwatch : Form
{
    private readonly Stopwatch sw = new Stopwatch();
    // Auxiliary member to avoid doing TimeSpan.FromMilliseconds repeatedly
    private TimeSpan timerSpan;

    public void TimerStart()
    {
        timerSpan = TimeSpan.FromMilliseconds(timer.Interval);
        timer.Start();
        sw.Restart();
    }

    public TimeSpan GetRemaining()
    {
        return timerSpan - sw.Elapsed;
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        // Do your thing
        sw.Restart();
    }
}

public partial class FormWithDateTime : Form
{
    private DateTime timerEnd;

    public void TimerStart()
    {
        timerEnd = DateTime.Now.AddMilliseconds(timer.Interval);
        timer.Start();
    }

    public TimeSpan GetRemaining()
    {
        return timerEnd - DateTime.Now;
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        // Do your thing
        timerEnd = DateTime.Now.AddMilliseconds(timer.Interval);
    }
}

正直なところ、を使用しても大きなメリットはありませんStopwatch。を使用すると、実際に必要な行が少なくなりますDateTime。さらに、後者は私には少し明確に思えます。

于 2019-12-23T16:47:30.037 に答える
0

私はちょっと簡単な私の解決策を持ってきました:

TotalMillisseconds1-タイマーを開始する前に、現在の時刻を(からDateTime.Now.TimeOfDay.TotalMilliseconds)に保存します。

double _startingTime = DateTime.Now.TimeOfDay.TotalMilliseconds;

2-タイマーが作動するたびに、現在の時刻を再度取得し、double変数を使用してこれら2つの差を取得します。

double _currentTime = DateTime.Now.TimeOfDay.TotalMilliseconds;
double _elapsed = _currentTime - _startingTime;

if(_elapsed >= 500)
{
    MessageBox.Show("As you command, master!");
    _startingTime = _currentTime;
}

if(_currentTime < _startingTime)
    _startingTime = _currentTime;

3-そして最後に、はTotalMilliseconds00:00(12pm)から経過したミリ秒数を返すため、真夜中にTotalMillisecondsなると、は0になります。この場合、_currentTimeがより低いかどうかを確認します。 _startingTime、その場合は、をに設定し_startingTimeて、_currentTime再度計算できるようにします。

これがお役に立てば幸いです

于 2020-06-05T14:02:08.107 に答える