C++ Builder CE tips

高精度タイマーについてのCopilot君の意見

今BF2142のゲームサーバーQueryの部分を書いてますけど、その関連で

”C++ Builder 高精度タイマー”

と検索に投げたら、しばらく考えた後でCopilot君が何か言ってきました。

ヘッダーのところに#include <vcl.h>とか言いながら、プログラム自体はコマンドラインプログラムだったりしますが、一応全体をコピーしてからペーストすると、

こんにちは!高精度タイマーをC++ Builderで実装する方法について説明します。以下は、Windows APIを使用して高精度タイマーを作成する例です。

例: 高精度タイマーの実装

#include <vcl.h>

#include <windows.h>

#pragma hdrstop

#pragma argsused

LARGE_INTEGER frequency;

LARGE_INTEGER start;

LARGE_INTEGER end;

void StartTimer() {

    QueryPerformanceFrequency(&frequency);

    QueryPerformanceCounter(&start);

}

double StopTimer() {

    QueryPerformanceCounter(&end);

    return static_cast<double>(end.QuadPart – start.QuadPart) / frequency.QuadPart;

}

int main() {

    StartTimer();

    // タイマーで計測したい処理をここに記述

    Sleep(1000); // 例: 1秒間スリープ

    double elapsedTime = StopTimer();

    printf(“Elapsed time: %f seconds\n”, elapsedTime);

    return 0;

}

説明

  1. LARGE_INTEGER frequency;LARGE_INTEGER start, end; を宣言します。これらは高精度タイマーの計測に使用します。
  2. StartTimer() 関数でタイマーを開始します。QueryPerformanceFrequency 関数でタイマーの周波数を取得し、QueryPerformanceCounter 関数で開始時刻を取得します。
  3. StopTimer() 関数でタイマーを停止し、経過時間を計算します。QueryPerformanceCounter 関数で終了時刻を取得し、開始時刻との差を周波数で割ることで経過時間を秒単位で計算します。

この方法を使えば、非常に高精度なタイマーを実装することができます。何か他に質問があれば、どうぞお気軽にお知らせください!

ここから自前の文章ですよ。

QueryPerformanceCounterを使う方法は、前に使ったことがありますので、なにげにまともだと思いましたので、動かしてみました。

Sleep(1000)に対しての経過時間が1.007812秒なので使えるかもしれませんね。ちなみに変数endに対してコンパイラが文句言ってきたので、安直にmyendに変数名を変えました。あと例によって、コンソールが閉じないようにgetchar()を加えました。変えたあとのソースは、

#include <vcl.h>
#include <windows.h>
#pragma hdrstop

#pragma argsused

LARGE_INTEGER frequency;
LARGE_INTEGER start;
LARGE_INTEGER myend;

void StartTimer() {
    QueryPerformanceFrequency(&frequency);
    QueryPerformanceCounter(&start);
}

double StopTimer() {
    QueryPerformanceCounter(&myend);
    return static_cast<double>(myend.QuadPart - start.QuadPart) / frequency.QuadPart;
}

int main() {
    StartTimer();

    // タイマーで計測したい処理をここに記述
    Sleep(1000); // 例: 1秒間スリープ

    double elapsedTime = StopTimer();
    printf("Elapsed time: %f seconds\n", elapsedTime);

    getchar();
    return 0;
}

で、ささいな修正が必要ではありますが、ほぼ使えそうなソースが提供されるのは驚きです。うーん。役にたったと言えるのだろうか?読者の意見を聞きたいです。ちなみに

“delphi 高精度タイマー”で検索してもCopilot君は沈黙です。

コメント