OSDN Git Service

Fix issue #903: 50% cpu use by winmergeu.exe after program closed
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Mon, 13 Sep 2021 10:42:33 +0000 (19:42 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Mon, 13 Sep 2021 10:42:33 +0000 (19:42 +0900)
Src/Common/IniOptionsMgr.cpp
Src/Common/IniOptionsMgr.h
Src/Common/RegOptionsMgr.cpp
Src/Common/RegOptionsMgr.h

index ac82aa5..ffd8c92 100644 (file)
@@ -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()
@@ -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);
index 6472f7f..f980c78 100644 (file)
@@ -53,4 +53,5 @@ private:
        String m_filePath;
        DWORD m_dwThreadId;
        HANDLE m_hThread;
+       HANDLE m_hEvent;
 };
index 81fd8ad..7bd2bc7 100644 (file)
@@ -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()
@@ -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);
@@ -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;
 }
index a73f92a..5110094 100644 (file)
@@ -59,6 +59,7 @@ private:
        bool m_bCloseHandle;
        DWORD m_dwThreadId;
        HANDLE m_hThread;
+       HANDLE m_hEvent;
        CRITICAL_SECTION m_cs;
        DWORD m_dwQueueCount;
 };