【问题标题】:Why do I get the error "The handle is invalid" when invoking GetThreadTimes?为什么调用 GetThreadTimes 时出现“句柄无效”错误?
【发布时间】:2013-10-11 21:19:24
【问题描述】:

我需要获取工作线程的 CPU 时间。看来我必须使用GetThreadTimes 来执行此操作,因为我的目标是 Windows XP 和更新版本。根据文档,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.

这是为什么?我们知道线程正在运行是因为“线程已启动!”跟踪消息。我尝试调整睡眠时间,直到线程终止。我仍然收到无效句柄错误。

测试程序是一个用 Visual C++ 6 构建的 MFC 应用程序。

【问题讨论】:

    标签: c++ windows multithreading visual-c++ mfc


    【解决方案1】:

    您的threadCWinThread *。您传递给GetThreadTimes 的参数应该是HANDLE

    CWinThread 有一个转换运算符来获取线程的操作系统句柄,因此您应该可以使用:GetThreadTimes(*thread, ...)

    还有另一个问题:您确实需要更改这些:

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

    到这样的事情:

    FILETIME creationTime;
    FILETIME exitTime;
    FILETIME kernelTime;
    FILETIME userTime;
    

    然后,当你调用函数时,你传递了每个函数的地址,所以你的调用看起来像这样:

    GetThreadTimes(*thread, &creationTime, &exitTime, &kernelTime, &userTime);
    

    【讨论】:

    • 编译器甚至让你通过CWinThread*
    • @DavidHeffernan:如果内存服务,在 VC++6 中使用 typedef void *HANDLE;,因此您可以将任何指针作为句柄传递。
    猜你喜欢
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    相关资源
    最近更新 更多