ホームページ パソコン
サービス案内
フリーソフト Windows
プログラミング
お勧めリンク プロフィール
メール
ホーム -> Windows プログラミング -> 本頁(Delphi コンポーネント) 

 
Delphi コンポーネント

マイクロ秒 ストップウォッチ  TSdStopWatch  (ソースコード・デモ付)
 

■  目  次  ■

概要と特徴

バージョン対応

テスト環境

使用例

TPanel に追加された公開プロパティ・メソッド・イベント

精度について
著作権

謝辞

ダウンロード

タイム取得関連のリンク
 
概要と特徴 目次に戻る↑

・ アプリでの処理時間進行表示用としても、作成時のプロセス処理時間計測用にも使用可
・ 精度: 1マイクロ秒(百万分の1秒) --- QueryPerformanceCounter() API を使用
・ 連続計測可能時間: 約29万年 ( ただし私の計算値。実際に確認してみたわけではありません)
・ TPanel を継承
・ TTimer を内臓し、経過時間もリアルタイム表示
・ ソースコード付により、使用者の好みに合わせて仕様変更可能 (ナノ秒・ピコ秒計測も)
  バグがあっても修正可能なのでとても安心
  SdStopWatch.pas / Ver1.00 / 2004.6.29. / Last Update 2004.7.2.

 尚、極短時間の単位は次のとおりである。
  ミリ秒   ・・・ 千分の1秒
  マイクロ秒 ・・・ 千分の1ミリ秒
  ナノ秒   ・・・ 千分の1マイクロ秒
  ピコ秒   ・・・ 千分の1ナノ秒
  フェトム秒 ・・・ 千分の1ピコ秒
  アト秒   ・・・ 千分のフェトム1秒
  ゼプト秒  ・・・ 千分の1アト秒
  ヨフト秒  ・・・ 千分の1ゼプト秒

 
 バージョン対応

・ Delphi4 以上に対応のはず。TTimer をリンクで組み込み。
  QueryPerformance() API の仕様のためか、私の力量不足のためかは定かでありませんが、 どうしても Delphi3 対応を作成することができませんでした。
  発売以来今日まで愛用してきた Delphi3 と別れる辛い日がついに来ました。

 
 テスト環境

  PC 組み立てパソコン  CPU Pentium3 1GHz Windows2000 SP4
  Delphi 6 personal, Delphi 7 professional

 

 

 使用例 目次に戻る↑

begin
  SdStopWatch1.Clear;
  SdStopWatch1.Font.Color := clRed;
  SdStopWatch1.Start;          // 計測開始

  // 計測したいコードをここに記述
 

  SdStopWatch1.Stop;          // 計測修了
  SdStopWatch1.Font.Color := clTeal; 

 
 TPanel に追加された公開プロパティ・メソッド・イベント

・ 追加されたプロパティとイベントはありません
・ 追加されたメソッドは、使用例に示した次の3つのみです
    Clear ・・・ 計測値表示を [0:00:00: 000:000] にします
    Start ・・・ 計測を開始します
    Stop  ・・・ 計測を修了します

 
 精度について 目次に戻る↑

  QueryPerformanceCounter() は、マザーボードにある高精度のパフォーマンスカウンターが起動時より刻んだクロック数を符号なし64ビット値で返します。 MSDN によれば、高速のCPUでは、この64ビットすべてをプログラムで使用する必要があるとされています。Delphi3 対応ができなかったのは、これをクリアできなかったためです。 それはともかく、この値をCPUごとに定められた[周波数/秒]で除算すると起動時よりの経過時間が得られます。 この計算結果を秒単位で得るかミリ秒単位で得るかにより、最大計測可能時間が決まりますが、 マイクロ秒単位でとった場合、私の計算では約29万年になります。ここまで来るとどうでもよいことですが。
  問題は、最小単位の精度です。MSDN によれば、2GHz を超える高性能CPUでは、放熱のため周波数を下げることがあるので正確な値をとらなくなるそうです。 まあ、血圧を測るときも安静にしていた状態が必要ですので、CPUがあまりカッカしていない状態での計測が「推奨」されます。
  尚、私の1GHzCPUと SEIKO社のストップウォッチを比較したところ、10時間で0.数秒の差が生まれるようです。 どちらが不正確なのか、それとも両方とも不正確なのか、は定かでありません。
  また、よく使われる Time(), GetTickCount() は精度が15ミリ秒ほどだそうで、昨今のCPUの性能からすると役不足の場合が出てきそうです。「windows95 APIバイブル3」を見ると、「マルチメディアタイマ」なるもので TimeGetTime() というのがありますが、精度では QueryPerformanceCounter() のほうが上のようです。とにかく Timer といってもまだまだ他にいろいろあることを今回知りました。機会があれば整理してみたいと思います。

 
 著作権

・・・ というほどの代物ではありませんが、佐渡山 博(さどやま ひろし)にあります。
  商用・業務用を含めて使用・配布・掲載・改造等は自由です。
  尚、バグやコードの誤りなどをご指摘いただければ助かります。
  また、改良された方は、勉強のため私にもソースを頂けると幸いです。 (メール)

 
 謝辞 目次に戻る↑

  今回苦戦したことの一つは、TPanel に TTimer を取り組むことでした。
  中村拓男氏著「Delphi コンポーネント設計&開発 完全解説」をもとに、次のサイトのコード例を参考にさせていただきました。
  http://delphi.about.com/library/bluc/text/uc083101a.htm

 
 ダウンロード

    stopwatchcomp.exe

  SdStopWatch.pas と SdStopWatch.dcr を同じフォルダに置いてインストールしてください。
  インストール先タブは「Samples」になっていますが、事前に適宜直してお使いください。

 
 タイム取得関連のリンク 目次に戻る↑

◎ MSDN

QueryPerformanceCounter()

QueryPerformanceFrequency()

about Timers

GetTickCount()

TimeGetTime()

TimeGetSystemTime()

◎ MicroSoft Japan
http://support.microsoft.com/default.aspx?scid=kb;ja;327809

このページのトップへ
ホーム -> Windows プログラミング -> 本頁(Delphi コンポーネント) 
ホームページ パソコン
サービス案内
フリーソフト Windows
プログラミング
お勧めリンク プロフィール
メール