Index: src/ch/UpdateChecker.cpp =================================================================== diff -u -N -rd0cfddc68b5ec4dc4e9b73b6f87aa97995c7cc54 -r4572f6cddf7dab06b1de99504a6bbd3680d11e6d --- src/ch/UpdateChecker.cpp (.../UpdateChecker.cpp) (revision d0cfddc68b5ec4dc4e9b73b6f87aa97995c7cc54) +++ src/ch/UpdateChecker.cpp (.../UpdateChecker.cpp) (revision 4572f6cddf7dab06b1de99504a6bbd3680d11e6d) @@ -53,7 +53,13 @@ // ============================================================================ CUpdateChecker::~CUpdateChecker() { - Cleanup(); + try + { + Cleanup(); + } + catch (const std::exception&) + { + } if(m_hKillEvent) ::CloseHandle(m_hKillEvent); @@ -82,12 +88,16 @@ if(bOnlyIfConnected && !InternetGetConnectedState(&dwConnectionFlags, 0)) return false; + ::EnterCriticalSection(&m_cs); + m_strSite = pszSite; m_eResult = eResult_Undefined; m_eUpdateChannel = eUpdateChannel; m_strLanguage = pszLanguage; m_bSendHeaders = bSendHeaders; + ::LeaveCriticalSection(&m_cs); + ::ResetEvent(m_hKillEvent); m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&CUpdateChecker::UpdateCheckThread, (void*)this, 0, NULL); @@ -112,7 +122,10 @@ { if(m_hKillEvent) ::SetEvent(m_hKillEvent); - WaitForSingleObject(m_hThread, 5000); + DWORD dwResult = WaitForSingleObject(m_hThread, 5000); + if (dwResult == WAIT_TIMEOUT || dwResult == WAIT_FAILED) + throw std::exception("Failed to stop update checker thread."); + m_hThread = NULL; }