TStopwatchの経過時間は停止状態でないと更新されない?

経過時間を示すElapsed/ElapsedMilliseconds/ElapsedTicksプロパティはStopメソッドで停止した状態でないと更新された値を取得できない。

Owl’s perspective: TStopwatch」より

あれ?そうだったかな。と、疑問に思ったので確かめてみた。

Elapsed プロパティの値は、ストップウォッチがすでに停止している場合にのみ更新されます。

Diagnostics.TStopwatch.Elapsed – XE API Documentation」より

ちゃんとヘルプにもそう書かれていました。

そうすると記憶違いかな。

とりあえず動作を確認してみると、Stopメソッドで停止した状態でなくても、ちゃんと計測されているみたい。

uses
  SysUtils, Diagnostics, TimeSpan;
var
  sw: TStopwatch;
begin
  try
    sw := TStopwatch.Create;
    sw.Start;

    Sleep(1000);
    Writeln(sw.ElapsedMilliseconds);

    Sleep(1000);
    Writeln(sw.ElapsedMilliseconds);

    Sleep(1000);
    sw.Stop;

    Writeln(sw.ElapsedMilliseconds);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

実行結果

1000
2000
3000

ヘルプには「TStopwatch では、オペレーティング システム依存の機能を利用して、高解像度タイマにアクセスします(高解像度タイマを使用できない場合は、通常のタイマが使用されます)。 (Diagnostics.TStopwatch – XE API Documentation)」と書かれているので、環境によるのかもしれない。

2011年9月24日追記

元記事が修正されています。

また「Owl’s perspective: TStopwatchその2」でヘルプの記述が間違っている歴史的理由が考察されています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください