Windowsフォームタイマーに少し問題があります。それは非常に基本的な質問ですが、私は周りを見回して答えを見つけることができないようです(私はおそらく平手打ちに値します)。
タイマーの経過時間が500msの間隔よりも大きいかどうかに関係なく、タイマーの値を取得できる必要があります。
何かのようなもの
Timer.Elapsed >= 500
Timer.Elapsed
「経過時間」を返すプロパティではありません-それはあなたが購読しているイベントです。アイデアは、イベントが頻繁に発生するということです。
あなたが欲しいのかどうかは本当にはっきりしていませんTimer
-おそらくSystem.Diagnostics.Stopwatch
あなたが本当に求めているのは何ですか?
var stopwatch = Stopwatch.StartNew();
// Do some work here
if (stopwatch.ElapsedMilliseconds >= 500)
{
...
}
タイマーの経過時間が500msの間隔よりも大きいかどうかに関係なく、タイマーの値を取得できる必要があります。
タイマーは、経過時間を確認できるインターフェイスを提供しません。彼らがする唯一のことは、彼らが期限切れになったときにイベントを発生させることです。
Stopwatch
クラスなど、他のメカニズムを使用して時間の経過を記録する必要があります。
TimerのIntervalプロパティをトリガーするミリ秒数(この例では500)に設定し、Tickイベントのイベントハンドラーを追加します。
私はこれをすばやく書きました、いくつかのバグがあるかもしれませんが、あなたに一般的な考えを与えます
Timer timer = new System.Windows.Forms.Timer();
timer.Interval = 500;
timer.Elapsed += (s,a) => {
MyFunction();
timer.Stop();
}
timer.Start();
でそれを行うことはできませんTimer
。Elapsed
0に達したときにトリガーされるイベントです。
イベントの経過時にリッスンしたい場合は、リッスンを登録してくださいElapsed
。Interval
待機時間を設定するメンバーです。
ここを参照してください:http: //msdn.microsoft.com/en-us/library/system.timers.timer (v = vs.100).aspx
ここ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
。さらに、後者は私には少し明確に思えます。
私はちょっと簡単な私の解決策を持ってきました:
TotalMillisseconds
1-タイマーを開始する前に、現在の時刻を(から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-そして最後に、はTotalMilliseconds
00:00(12pm)から経過したミリ秒数を返すため、真夜中にTotalMilliseconds
なると、は0になります。この場合、_currentTime
がより低いかどうかを確認します。 _startingTime
、その場合は、をに設定し_startingTime
て、_currentTime
再度計算できるようにします。
これがお役に立てば幸いです