Index: src/libchcore/TOverlappedReaderFB.cpp =================================================================== diff -u -N -rb051cbac8dac8c448507aa7c64753af9cf793af5 -rc719644bb4360fcf7ccf6f1139bcae852bd6effd --- src/libchcore/TOverlappedReaderFB.cpp (.../TOverlappedReaderFB.cpp) (revision b051cbac8dac8c448507aa7c64753af9cf793af5) +++ src/libchcore/TOverlappedReaderFB.cpp (.../TOverlappedReaderFB.cpp) (revision c719644bb4360fcf7ccf6f1139bcae852bd6effd) @@ -71,6 +71,7 @@ TSubTaskBase::ESubOperationResult TOverlappedReaderFB::StopThreaded() { + WaitForSingleObjectEx(m_eventProcessingFinished.Handle(), INFINITE, FALSE); return m_eThreadResult; } @@ -81,6 +82,7 @@ void TOverlappedReaderFB::StartThreaded() { + m_eventProcessingFinished.ResetEvent(); TEventGuard guardProcessingFinished(m_eventProcessingFinished, true); TEvent eventNonSignaled(true, false); @@ -104,40 +106,47 @@ bool bDataSourceFinished = false; - while(m_eThreadResult == TSubTaskBase::eSubResult_Continue && !bDataSourceFinished) + try { - DWORD dwResult = WaitForMultipleObjectsEx(boost::numeric_cast(vHandles.size()), vHandles.data(), false, INFINITE, true); - switch(dwResult) + while(m_eThreadResult == TSubTaskBase::eSubResult_Continue && !bDataSourceFinished) { - case STATUS_USER_APC: - break; + DWORD dwResult = WaitForMultipleObjectsEx(boost::numeric_cast(vHandles.size()), vHandles.data(), false, INFINITE, true); + switch(dwResult) + { + case STATUS_USER_APC: + break; - case WAIT_OBJECT_0 + eKillThread: - m_eThreadResult = TSubTaskBase::eSubResult_KillRequest; - break; + case WAIT_OBJECT_0 + eKillThread: + m_eThreadResult = TSubTaskBase::eSubResult_KillRequest; + break; - case WAIT_OBJECT_0 + eReadPossible: - m_eThreadResult = OnReadPossible(); - break; + case WAIT_OBJECT_0 + eReadPossible: + m_eThreadResult = OnReadPossible(); + break; - case WAIT_OBJECT_0 + eReadFailed: - m_eThreadResult = OnReadFailed(); - break; + case WAIT_OBJECT_0 + eReadFailed: + m_eThreadResult = OnReadFailed(); + break; - case WAIT_OBJECT_0 + eDataSourceFinished: - bDataSourceFinished = true; - m_eThreadResult = TSubTaskBase::eSubResult_Continue; - break; + case WAIT_OBJECT_0 + eDataSourceFinished: + bDataSourceFinished = true; + m_eThreadResult = TSubTaskBase::eSubResult_Continue; + break; - default: - throw TCoreException(eErr_UnhandledCase, L"Unknown result from async waiting function", LOCATION); + default: + throw TCoreException(eErr_UnhandledCase, L"Unknown result from async waiting function", LOCATION); + } } } + catch(const std::exception&) + { + m_eThreadResult = TSubTaskBase::eSubResult_Error; + } WaitForOnTheFlyBuffers(); ClearQueues(); - if(bDataSourceFinished) + if(m_eThreadResult == TSubTaskBase::eSubResult_Continue && bDataSourceFinished) m_eventReadingFinished.SetEvent(); }