プロセスの残り時間を次の形式で出力したいと思います。
d hh:mm:ss
プロセスが開始するDateTime startTime
と、現在の時刻で変数が設定されます。
そこから、GUIに毎秒ラベルを更新するタイマーがあり、残り時間を計算する必要があります。
TimeSpan timeRemaining = TimeSpan.FromTicks(DateTime.Now.Subtract(startTime).Ticks * (iProgress.Maximum - iProgress.Value) / iProgress.Value);
そして、ラベルで次のように使用します。
labelTimeRemaining.Text = timeRemaining.ToString(@"d\ hh\:mm\:ss");
ただし、表示される時間変化は、定常モードに入ると非常に奇妙に数分間ジャンプします。
私はそれが最初にジャンプするべきであることを知っていますが、それはある時点で安定するはずですよね?
私は毎秒約1〜3レコードを処理しますが、残り時間は更新ごとに10〜20分ジャンプしています。
何が間違っているのですか、またはこの問題をどのように修正できますか?
さらに情報やコードが必要な場合はお知らせください。
アップデート
以下は私が使用しているコードの一部です:
private Stopwatch _timer = new Stopwatch();
private int _total = 0;
private int _current = 0;
次のコマンドでスレッドまたはタスクを開始します。
private void MyTask()
{
_timer.Reset();
_timer.Start();
for (int i = 0; i < _total; i++)
{
_current++;
Thread.Sleep(500);
}
_timer.Stop();
}
以下の関数を使用してwinformsタイマーを作成し、毎秒実行します。
if (_timer.IsRunning && _current > 0)
{
float elapsedMin = ((float)_timer.ElapsedMilliseconds / 1000) / 60;
float minLeft = (elapsedMin / _current) * (_total - _current);
TimeSpan eta = TimeSpan.FromMinutes(minLeft);
iStatus.Text = eta.ToString(@"d\ hh\:mm\:ss");
}