1

ワーカー スレッドの CPU 時間を取得する必要があります。Windows XP以降をターゲットにしているため、これを行うにはGetThreadTimesを使用する必要があるようです。ドキュメントによると、Windows XP はQueryThreadCycleTimeをサポートしていません。

私が書いたテストプログラムの要点は次のとおりです。

#include <windows.h>

UINT TestFunction(LPVOID pParam)
{
    TRACE("Thread Started!\n");
    Sleep(10000);
    TRACE("Thread about to terminate!\n");
    return 0;
}

...

CWinThread* thread = AfxBeginThread(TestFunction, NULL);

Sleep(500);

LPFILETIME creationTime = NULL;
LPFILETIME exitTime = NULL;
LPFILETIME kernelTime = NULL;
LPFILETIME userTime = NULL;

int result = GetThreadTimes(thread, creationTime, exitTime, kernelTime, userTime);

TRACE("Result: %d\n", result);

if(result != 0)
{
    TRACE("Got result!\n");
}
else
{
    //ref: http://msdn.microsoft.com/en-us/library/windows/desktop/ms680582(v=vs.85).aspx
    LPVOID lpMsgBuf;
    DWORD dw = GetLastError(); 

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL
    );

    TRACE("Timing query failed with error %d: %s", dw, lpMsgBuf);

    LocalFree(lpMsgBuf);

...

そして、次のデバッグ出力が得られます。

Thread Started!
Result: 0
Timing query failed with error 6: The handle is invalid.

どうしてこれなの?「Thread Started!」というメッセージが表示されるため、スレッドが実行中であることがわかります。トレース メッセージ。スレッドが終了するまでスリープ時間を微調整してみました。無効なハンドル エラーが引き続き発生します。

テスト プログラムは、Visual C++ 6 でビルドされた MFC アプリケーションです。

4

1 に答える 1