[BlueLeaf1336]> PROBLEMS> 探求其之壱>

探求其之壱 > CPU時間

historyTOP

2006/03/03:作成

GetProcessTimesTOP

PlatformSDK でスレッドの情報を取得する API を見ていて、GetThreadTimes というものを見つけました。

function GetThreadTimes(
    hThread: THandle;           //  Handle to the thread
    var lpCreationTime,         //  the creation time of the thread
        lpExitTime,             //  the exit time of the thread
        lpKernelTime,           //  the amount of time ... in kernel mode
        lpUserTime: TFileTime   //  the amount of time ... in user mode
    ): BOOL; stdcall;

Windows.pas の宣言と、Platform SDK の説明を合体させるとこんな感じでした。

ひょっとして!! GetProcessTimes ってあるんじゃ? ... ありました。

function GetProcessTimes(
    hProcess: THandle;          //  Handle to the process
    var lpCreationTime,         //  the creation time of the process
        lpExitTime,             //  the exit time of the process
        lpKernelTime,           //  the amount of time ... in kernel mode
        lpUserTime: TFileTime   //  the amount of time ... in user mode
    ): BOOL; stdcall;

これ、タスクマネージャの「CPU時間」のことではないのか、と思って試してみると、まさにそのとおりのような感じでした。「これ」っていうのは、lpKernelTime でもなく、lpUserTime でもなく、lpKernelTime + lpUserTime ですが。

ソースコード(擬似)TOP

var
    ftCreation: TFileTime;
    ftExitTime: TFileTime;
    ftKernelTime: TFileTime;
    ftUserTime: TFileTime;

    //stCreation: TSystemTime;
    //stExitTime: TSystemTime;
    stKernelTime: TSystemTime;
    stUserTime: TSystemTime;

    //dtCreation: TDateTime;
    //dtExitTime: TDateTime;
    dtKernelTime: TDateTime;
    dtUserTime: TDateTime;
begin
    //  CPU時間
    dtKernelTime := 0;
    dtUserTime := 0;

    //  hProcess = 調べたいプロセスのハンドル
    GetProcessTimes(hProcess, ftCreation, ftExitTime, ftKernelTime, ftUserTime);

    //  システム日時に変換
    //FileTimeToSystemTime(ftCreation, stCreation);
    //FileTimeToSystemTime(ftExitTime, stExitTime);
    FileTimeToSystemTime(ftKernelTime, stKernelTime);
    FileTimeToSystemTime(ftUserTime, stUserTime);
    //  日付型に変換
    //dtCreation := SystemTimeToDateTime(stCreation);
    //dtExitTime := SystemTimeToDateTime(stExitTime);
    dtKernelTime := SystemTimeToDateTime(stKernelTime);
    dtUserTime := SystemTimeToDateTime(stUserTime);

    //  -109205 は 多分時間の最小値(1601年ごろ)
    DateUtils.SecondsBetween(dtKernelTime + dtUserTime, -109205 * 2)));
end;

進捗状況TOP

20060303TaskMan.zip(214,650Bytes) ソースコードと実行ファイルです。

いまさらですが、こんな風に左のような画像を出してると、これが実行画面のように見えますが、実際はふにゃふにゃな画面です。念のため。

だんだんと速度が落ちてきました。今回なんざ解決したのは1つだけです。ゼロよりははるかにましですが。

EOFTOP