Index: src/libchcore/TOverlappedReaderFB.cpp =================================================================== diff -u -N -rb0a003dc39e6d21e34779cf1cf5d8a07318c1f5f -r7892d3d5ca43da7dca4d9e8e0c321c21c3e13ea0 --- src/libchcore/TOverlappedReaderFB.cpp (.../TOverlappedReaderFB.cpp) (revision b0a003dc39e6d21e34779cf1cf5d8a07318c1f5f) +++ src/libchcore/TOverlappedReaderFB.cpp (.../TOverlappedReaderFB.cpp) (revision 7892d3d5ca43da7dca4d9e8e0c321c21c3e13ea0) @@ -21,6 +21,7 @@ #include "TCoreException.h" #include "TFileInfo.h" #include "TWorkerThreadController.h" +#include "TEventGuard.h" namespace chcore { @@ -41,7 +42,8 @@ m_spStats(spStats), m_spSrcFileInfo(spSrcFileInfo), m_rThreadController(rThreadController), - m_eventDataSourceFinished(true, false) + m_eventReadingFinished(true, false), + m_eventProcessingFinished(true, false) { if(!spFeedbackHandler) throw TCoreException(eErr_InvalidArgument, L"spFeedbackHandler is NULL", LOCATION); @@ -78,6 +80,8 @@ void TOverlappedReaderFB::StartThreaded() { + TEventGuard guardProcessingFinished(m_eventProcessingFinished, true); + m_eThreadResult = TSubTaskBase::eSubResult_Continue; // read data from file to buffer @@ -121,7 +125,7 @@ case WAIT_OBJECT_0 + eDataSourceFinished: m_eThreadResult = TSubTaskBase::eSubResult_Continue; - m_eventDataSourceFinished.SetEvent(); + m_eventReadingFinished.SetEvent(); return; default: @@ -163,11 +167,16 @@ m_spReader->ReleaseBuffers(); } - HANDLE TOverlappedReaderFB::GetEventDataSourceFinishedHandle() const + HANDLE TOverlappedReaderFB::GetEventReadingFinishedHandle() const { - return m_eventDataSourceFinished.Handle(); + return m_eventReadingFinished.Handle(); } + HANDLE TOverlappedReaderFB::GetEventProcessingFinishedHandle() const + { + return m_eventProcessingFinished.Handle(); + } + TSubTaskBase::ESubOperationResult TOverlappedReaderFB::OnReadPossible() { TOverlappedDataBuffer* pBuffer = m_spReader->GetEmptyBuffer();