Skip to content

Commit

Permalink
Fix issue #903: 50% cpu use by winmergeu.exe after program closed
Browse files Browse the repository at this point in the history
  • Loading branch information
sdottaka committed Sep 13, 2021
1 parent 4478a7f commit 74a6f2f
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 1 deletion.
8 changes: 8 additions & 0 deletions Src/Common/IniOptionsMgr.cpp
Expand Up @@ -25,11 +25,16 @@ CIniOptionsMgr::CIniOptionsMgr(const String& filePath)
, m_filePath{filePath}
, m_dwThreadId(0)
, m_hThread(nullptr)
, m_hEvent(nullptr)
{
m_iniFileKeyValues = Load(m_filePath);
m_hEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr);
m_hThread = reinterpret_cast<HANDLE>(
_beginthreadex(nullptr, 0, AsyncWriterThreadProc, this, 0,
reinterpret_cast<unsigned *>(&m_dwThreadId)));
WaitForSingleObject(m_hEvent, INFINITE);
CloseHandle(m_hEvent);
m_hEvent = nullptr;
}

CIniOptionsMgr::~CIniOptionsMgr()
Expand All @@ -46,6 +51,9 @@ unsigned __stdcall CIniOptionsMgr::AsyncWriterThreadProc(void *pvThis)
CIniOptionsMgr *pThis = reinterpret_cast<CIniOptionsMgr *>(pvThis);
MSG msg;
BOOL bRet;
// create message queue
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
SetEvent(pThis->m_hEvent);
while ((bRet = GetMessage(&msg, 0, 0, 0)) != 0)
{
auto* pParam = reinterpret_cast<AsyncWriterThreadParams *>(msg.wParam);
Expand Down
1 change: 1 addition & 0 deletions Src/Common/IniOptionsMgr.h
Expand Up @@ -53,4 +53,5 @@ class CIniOptionsMgr : public COptionsMgr
String m_filePath;
DWORD m_dwThreadId;
HANDLE m_hThread;
HANDLE m_hEvent;
};
11 changes: 10 additions & 1 deletion Src/Common/RegOptionsMgr.cpp
Expand Up @@ -27,12 +27,17 @@ CRegOptionsMgr::CRegOptionsMgr()
, m_bCloseHandle(false)
, m_dwThreadId(0)
, m_hThread(nullptr)
, m_hEvent(nullptr)
, m_dwQueueCount(0)
{
InitializeCriticalSection(&m_cs);
m_hEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr);
m_hThread = reinterpret_cast<HANDLE>(
_beginthreadex(nullptr, 0, AsyncWriterThreadProc, this, 0,
reinterpret_cast<unsigned *>(&m_dwThreadId)));
WaitForSingleObject(m_hEvent, INFINITE);
CloseHandle(m_hEvent);
m_hEvent = nullptr;
}

CRegOptionsMgr::~CRegOptionsMgr()
Expand Down Expand Up @@ -101,6 +106,9 @@ unsigned __stdcall CRegOptionsMgr::AsyncWriterThreadProc(void *pvThis)
CRegOptionsMgr *pThis = reinterpret_cast<CRegOptionsMgr *>(pvThis);
MSG msg;
BOOL bRet;
// create message queue
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
SetEvent(pThis->m_hEvent);
while ((bRet = GetMessage(&msg, 0, 0, 0)) != 0)
{
auto* pParam = reinterpret_cast<AsyncWriterThreadParams *>(msg.wParam);
Expand Down Expand Up @@ -392,7 +400,8 @@ int CRegOptionsMgr::SaveOption(const String& name)
{
auto* pParam = new AsyncWriterThreadParams(name, value);
InterlockedIncrement(&m_dwQueueCount);
PostThreadMessage(m_dwThreadId, WM_USER, (WPARAM)pParam, 0);
if (!PostThreadMessage(m_dwThreadId, WM_USER, (WPARAM)pParam, 0))
InterlockedDecrement(&m_dwQueueCount);
}
return retVal;
}
Expand Down
1 change: 1 addition & 0 deletions Src/Common/RegOptionsMgr.h
Expand Up @@ -59,6 +59,7 @@ class CRegOptionsMgr: public COptionsMgr
bool m_bCloseHandle;
DWORD m_dwThreadId;
HANDLE m_hThread;
HANDLE m_hEvent;
CRITICAL_SECTION m_cs;
DWORD m_dwQueueCount;
};

0 comments on commit 74a6f2f

Please sign in to comment.