ワーカー スレッドの 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 アプリケーションです。