XN_C_API XnStatus xnOSWaitAndTerminateThread(XN_THREAD_HANDLE* pThreadHandle, XnUInt32 nMilliseconds) { XnStatus nRetVal = XN_STATUS_OK; XN_VALIDATE_INPUT_PTR(pThreadHandle); // first, wait for thread to exit on its own nRetVal = xnOSWaitForThreadExit(*pThreadHandle, nMilliseconds); if (nRetVal != XN_STATUS_OK) { // thread did not exit on its own. Kill it. xnLogWarning(XN_MASK_OS, "Thread did not shutdown in %u ms. Thread will be killed...", nMilliseconds); xnOSTerminateThread(pThreadHandle); } else { // thread exited. Just close the handle. xnOSCloseThread(pThreadHandle); } return (XN_STATUS_OK); }
// Stream VideoStream::~VideoStream() { // Make sure stream is stopped. stop(); m_device.clearStream(this); // Detach all recorders from this stream. xnl::LockGuard< Recorders > guard(m_recorders); while (m_recorders.Begin() != m_recorders.End()) { // NOTE: DetachStream has a side effect of modifying m_recorders. m_recorders.Begin()->Value()->detachStream(*this); } // Try to close the thread properly, and forcibly terminate it if failed/timedout. m_running = false; xnOSSetEvent(m_newFrameInternalEvent); xnOSSetEvent(m_newFrameInternalEventForFrameHolder); XnStatus rc = xnOSWaitForThreadExit(m_newFrameThread, STREAM_DESTROY_THREAD_TIMEOUT); if (rc != XN_STATUS_OK) { xnOSTerminateThread(&m_newFrameThread); } else { xnOSCloseThread(&m_newFrameThread); } m_pFrameHolder->setStreamEnabled(this, FALSE); m_driverHandler.deviceDestroyStream(m_device.getHandle(), m_streamHandle); xnOSCloseEvent(&m_newFrameInternalEvent); xnOSCloseEvent(&m_newFrameInternalEventForFrameHolder); XN_DELETE_ARR(m_pSensorInfo->pSupportedVideoModes); XN_DELETE(m_pSensorInfo); }
void xnUSBAsynchThreadStop() { if (g_InitData.hThread != NULL) { // mark for thread to exit g_InitData.bShouldThreadRun = FALSE; // wait for it to exit xnLogVerbose(XN_MASK_USB, "Shutting down USB events thread..."); XnStatus nRetVal = xnOSWaitForThreadExit(g_InitData.hThread, XN_USB_HANDLE_EVENTS_TIMEOUT * 2); if (nRetVal != XN_STATUS_OK) { xnLogWarning(XN_MASK_USB, "USB events thread didn't shutdown. Terminating it..."); xnOSTerminateThread(&g_InitData.hThread); } else { xnOSCloseThread(&g_InitData.hThread); } g_InitData.hThread = NULL; } }