0

HANDLES最初のものnextColorFrameEventはイベントハンドラーで、2番目のものはストリームハンドラーです。これらは、次のコードで初期化されています。

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

ストリーム ハンドラを閉じるには別の関数が必要ですか?

4

4 に答える 4

1

イベントが作成されなかった場合、CreateEvent ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms682396(v=vs.85).aspx ) は NULL を返します。

NULL ではない INVALID_HANDLE_VALID に対してチェックしています。

于 2013-05-03T12:19:38.870 に答える