我正在使用 HANDLES
,第一个 nextColorFrameEvent
是事件处理程序,第二个是流处理程序。它们在以下代码中被初始化:
nextColorFrameEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
hr = nui->NuiImageStreamOpen(
NUI_IMAGE_TYPE_COLOR,
NUI_IMAGE_RESOLUTION_640x480,
0,
2,
nextColorFrameEvent,
&videoStreamHandle);
我想在销毁时正确处理它们,同时不产生错误。有时初始化器不会被调用,所以当软件结束时两个 HANDLEs 仍然是 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) The handle is invalid. Which means that closeHandle ran anyway despite the tests. What tests should I do to prevent closing when the handle is not a valid 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
我需要一个不同的函数来关闭流处理程序吗?
最佳答案
nui->NuiImageStreamOpen(...)
不会为流创建有效的 Windows 句柄,而是在驱动程序端创建一个内部句柄。
所以你不能使用windows API来释放/关闭流句柄!!!
- 为此只需调用
nui->NuiShutdown()
。我还没有使用回调事件,但我认为它是一个有效的窗口句柄,应该可以正常关闭。 - 如果您只需要更改设置,您可以随时使用新设置调用
nui->NuiImageStreamOpen(...)
。无需关机... - 我也欢迎函数
nui->NuiImageStreamClose(...);
,因为 API 的当前状态随着传感器配置的变化而使长期运行的 ap 变得复杂。
关于c++ - 检查并关闭 HANDLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16358727/