为啥调用 GetThreadTimes 时出现“句柄无效”错误?
Posted
技术标签:
【中文标题】为啥调用 GetThreadTimes 时出现“句柄无效”错误?【英文标题】: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 应用程序。
【问题讨论】:
【参考方案1】:您的thread
是CWinThread *
。您传递给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;
,因此您可以将任何指针作为句柄传递。以上是关于为啥调用 GetThreadTimes 时出现“句柄无效”错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 Eloquent 模型中调用方法时出现“不应静态调用非静态方法”?
为啥从 Word doc 调用宏时出现错误 1004,而不是从 Excel 调用?
我可以从线程内调用 GetThreadTimes() 吗? [关闭]
为啥在 Jupyter 笔记本中调用 cv2.imshow() 时出现无响应窗口
在列表上使用 += 时出现 UnboundLocalError。为啥直接调用 __iadd__ 时这里需要 `nonlocal` 可以正常工作?