【发布时间】:2013-05-03 12:16:03
【问题描述】:
我正在使用HANDLES,第一个,nextColorFrameEvent 是事件处理程序,第二个是流处理程序。它们在以下代码中被初始化:
nextColorFrameEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
hr = nui->NuiImageStreamOpen(
NUI_IMAGE_TYPE_COLOR,
NUI_IMAGE_RESOLUTION_640x480,
0,
2,
nextColorFrameEvent,
&videoStreamHandle);
我想在销毁时妥善处理它们,同时不产生错误。有时初始化程序不会被调用,因此当软件结束时,两个 HANDLE 仍然为 NULL。这就是为什么我想首先检查 HANDLE 是否已正确初始化等,如果是,我想关闭它们。为此,我得到了以下代码:
if (nextColorFrameEvent && nextColorFrameEvent != INVALID_HANDLE_VALUE)CloseHandle(nextColorFrameEvent);
#ifdef QT_DEBUG
DWORD error = GetLastError();
qDebug()<< error;
#endif
if (videoStreamHandle && videoStreamHandle != INVALID_HANDLE_VALUE)CloseHandle(videoStreamHandle);
#ifdef QT_DEBUG
error = GetLastError();
qDebug()<< error;
#endif
但这显然是不正确的:如果我不运行初始化程序然后关闭软件这段代码运行并给我一个 6:
Starting C:\...\Qt\build-simpleKinectController-Desktop_Qt_5_0_2_MSVC2012_64bit-Debug\debug\simpleKinectController...
6
6
C:\...\Qt\build-simpleKinectController-Desktop_Qt_5_0_2_MSVC2012_64bit-Debug\debug\simpleKinectController exited with code 0
意思是:
ERROR_INVALID_HANDLE 6 (0x6) 句柄无效。 这意味着尽管经过测试,closeHandle 仍然运行。当句柄不是有效的 HANDLE 时,我应该做哪些测试来防止关闭?
额外问题:如果我运行初始化程序,仅在关闭 colorFrameEvent 时将不再出现此错误,但在关闭 videoStreamHandle 时仍会出现:
Starting C:\...\Qt\build-simpleKinectController-Desktop_Qt_5_0_2_MSVC2012_64bit-Debug\debug\simpleKinectController...
0
6
C:\...\Qt\build-simpleKinectController-Desktop_Qt_5_0_2_MSVC2012_64bit-Debug\debug\simpleKinectController exited with code 0
我需要不同的函数来关闭流处理程序吗?
【问题讨论】:
-
GetLastError每次都会被调用,不是吗? -
我的意思是
GetLastError函数在两种情况下都会被调用:失败(当HANDLE无效时)和成功(当HANDLE有效时)。这有点奇怪。 -
为什么?如果 CloseHandle 函数运行正常,则返回 0。
-
在
NuiImageStreamOpen调用之前,您还没有初始化videoStreamHandle。最好自己将其初始化为无效值,而不是依赖 API 调用。 API 文档只保证它会通过它的返回值报告错误,它没有说明输出参数。 -
只有在CloseHandle返回0时才调用GetLastError。一般Win32 API函数成功时,GetLastError的结果是不确定的。