OSDN Git Service

Fix ProgressDlg Sometime thread is dead blocked.
authorFrank Li <lznuaa@gmail.com>
Fri, 6 Mar 2009 13:22:16 +0000 (21:22 +0800)
committerFrank Li <lznuaa@gmail.com>
Fri, 6 Mar 2009 13:22:16 +0000 (21:22 +0800)
Avoid update UI at back thread.

Signed-off-by: Frank Li <lznuaa@gmail.com>
src/TortoiseProc/CommitDlg.cpp
src/TortoiseProc/ProgressDlg.cpp
src/TortoiseProc/ProgressDlg.h

index ca21f27..0ad7345 100644 (file)
@@ -120,7 +120,7 @@ BOOL CCommitDlg::OnInitDialog()
 \r
        UpdateData(FALSE);\r
        \r
-       m_ListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS , _T("CommitDlg"));\r
+       m_ListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS | SVNSLC_COLADD |SVNSLC_COLDEL, _T("CommitDlg"));\r
        m_ListCtrl.SetSelectButton(&m_SelectAll);\r
        m_ListCtrl.SetStatLabel(GetDlgItem(IDC_STATISTICS));\r
        m_ListCtrl.SetCancelBool(&m_bCancelled);\r
index 83dfd50..3ec55ba 100644 (file)
@@ -35,6 +35,7 @@ void CProgressDlg::DoDataExchange(CDataExchange* pDX)
 \r
 \r
 BEGIN_MESSAGE_MAP(CProgressDlg, CResizableStandAloneDialog)\r
+       ON_MESSAGE(MSG_PROGRESSDLG_UPDATE_UI, OnProgressUpdateUI)\r
 END_MESSAGE_MAP()\r
 \r
 BOOL CProgressDlg::OnInitDialog()\r
@@ -85,7 +86,7 @@ UINT CProgressDlg::ProgressThread()
        PROCESS_INFORMATION pi;\r
        HANDLE hRead;\r
 \r
-       m_Animate.Play(0,-1,-1);\r
+       this->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_START,0);\r
 \r
        CString *pfilename;\r
        if(m_LogFile.IsEmpty())\r
@@ -94,7 +95,6 @@ UINT CProgressDlg::ProgressThread()
                pfilename=&m_LogFile;\r
 \r
        g_Git.RunAsync(this->m_GitCmd,&pi, &hRead,pfilename);\r
-       this->DialogEnableWindow(IDOK,FALSE);\r
 \r
        DWORD readnumber;\r
        char buffer[2];\r
@@ -102,7 +102,7 @@ UINT CProgressDlg::ProgressThread()
        while(ReadFile(hRead,buffer,1,&readnumber,NULL))\r
        {\r
                buffer[readnumber]=0;\r
-               ParserCmdOutput((TCHAR)buffer[0]);\r
+               this->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_END,(TCHAR)buffer[0]);\r
        }\r
 \r
        CloseHandle(pi.hThread);\r
@@ -119,13 +119,30 @@ UINT CProgressDlg::ProgressThread()
 \r
        CloseHandle(hRead);\r
 \r
-       m_Progress.SetPos(100);\r
-       this->DialogEnableWindow(IDOK,TRUE);\r
+       this->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_END,0);\r
 \r
-       m_Animate.Stop();\r
        return 0;\r
 }\r
 \r
+LRESULT CProgressDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam)\r
+{\r
+       if(wParam == MSG_PROGRESSDLG_START)\r
+       {\r
+               m_Animate.Play(0,-1,-1);\r
+               this->DialogEnableWindow(IDOK,FALSE);\r
+       }\r
+       if(wParam == MSG_PROGRESSDLG_END)\r
+       {\r
+               m_Animate.Stop();\r
+               m_Progress.SetPos(100);\r
+               this->DialogEnableWindow(IDOK,TRUE);\r
+       }\r
+\r
+       if(lParam != 0)\r
+               ParserCmdOutput((TCHAR)lParam);\r
+\r
+       return 0;\r
+}\r
 int CProgressDlg::FindPercentage(CString &log)\r
 {\r
        int s1=log.Find(_T('%'));\r
index 5a94665..f646018 100644 (file)
@@ -2,7 +2,10 @@
 \r
 #include "StandAloneDlg.h"\r
 \r
+#define MSG_PROGRESSDLG_UPDATE_UI      (WM_USER+121)\r
 // CProgressDlg dialog\r
+#define MSG_PROGRESSDLG_START 0\r
+#define MSG_PROGRESSDLG_END   110\r
 \r
 class CProgressDlg : public CResizableStandAloneDialog\r
 {\r
@@ -36,6 +39,8 @@ protected:
        int                     FindPercentage(CString &log);\r
        void        RemoveLastLine(CString &str);\r
 \r
+       LRESULT CProgressDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam);\r
+\r
        CString         m_LogText;\r
        DECLARE_MESSAGE_MAP()\r
 };\r