OSDN Git Service

Basic Fixed issue #122: Garbage text in "Git Command Progress" / suspected buffer...
authorFrank Li <lznuaa@gmail.com>
Sun, 26 Jul 2009 12:50:47 +0000 (20:50 +0800)
committerFrank Li <lznuaa@gmail.com>
Sun, 26 Jul 2009 12:50:47 +0000 (20:50 +0800)
But speed is too slow

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

index af71e5b..66909ca 100644 (file)
@@ -92,7 +92,7 @@ UINT CProgressDlg::ProgressThreadEntry(LPVOID pVoid)
 }\r
 \r
 //static function, Share with SyncDialog\r
-UINT CProgressDlg::RunCmdList(CWnd *pWnd,std::vector<CString> &cmdlist,bool bShowCommand,CString *pfilename,bool *bAbort)\r
+UINT CProgressDlg::RunCmdList(CWnd *pWnd,std::vector<CString> &cmdlist,bool bShowCommand,CString *pfilename,bool *bAbort,std::vector<TCHAR>*pdata)\r
 {\r
        UINT ret=0;\r
 \r
@@ -101,6 +101,9 @@ UINT CProgressDlg::RunCmdList(CWnd *pWnd,std::vector<CString> &cmdlist,bool bSho
 \r
        pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_START,0);\r
 \r
+       if(pdata)\r
+               pdata->clear();\r
+                \r
        for(int i=0;i<cmdlist.size();i++)\r
        {\r
                if(cmdlist[i].IsEmpty())\r
@@ -111,7 +114,14 @@ UINT CProgressDlg::RunCmdList(CWnd *pWnd,std::vector<CString> &cmdlist,bool bSho
                        CString str;\r
                        str+= cmdlist[i]+_T("\n\n");\r
                        for(int j=0;j<str.GetLength();j++)\r
-                               pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,str[j]);\r
+                       {\r
+                               if(pdata)\r
+                                       pdata->push_back(str[j]);\r
+                               else\r
+                                       pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,str[j]);\r
+                       }\r
+                       if(pdata)\r
+                               pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,0);\r
                }\r
 \r
                g_Git.RunAsync(cmdlist[i],&pi, &hRead,pfilename);\r
@@ -122,7 +132,15 @@ UINT CProgressDlg::RunCmdList(CWnd *pWnd,std::vector<CString> &cmdlist,bool bSho
                while(ReadFile(hRead,buffer,1,&readnumber,NULL))\r
                {\r
                        buffer[readnumber]=0;\r
-                       pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,(TCHAR)buffer[0]);\r
+                       \r
+                       if(pdata)\r
+                       {\r
+                               pdata->push_back((TCHAR)buffer[0]);\r
+\r
+                               if(buffer[0] == '\r' || buffer[0] == '\n')\r
+                                       pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,0);\r
+                       }else\r
+                               pWnd->PostMessage(MSG_PROGRESSDLG_UPDATE_UI,MSG_PROGRESSDLG_RUN,buffer[0]);\r
                }\r
        \r
                CloseHandle(pi.hThread);\r
@@ -164,7 +182,7 @@ UINT CProgressDlg::ProgressThread()
        else\r
                pfilename=&m_LogFile;   \r
 \r
-       m_GitStatus = RunCmdList(this,m_GitCmdList,m_bShowCommand,pfilename,&m_bAbort);;\r
+       m_GitStatus = RunCmdList(this,m_GitCmdList,m_bShowCommand,pfilename,&m_bAbort,&this->m_Databuf);;\r
        return 0;\r
 }\r
 \r
@@ -172,11 +190,15 @@ LRESULT CProgressDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam)
 {\r
        if(wParam == MSG_PROGRESSDLG_START)\r
        {\r
+               m_BufStart = 0 ;\r
                m_Animate.Play(0,-1,-1);\r
                this->DialogEnableWindow(IDOK,FALSE);\r
        }\r
        if(wParam == MSG_PROGRESSDLG_END || wParam == MSG_PROGRESSDLG_FAILED)\r
        {\r
+               m_BufStart=0;\r
+               this->m_Databuf.clear();\r
+\r
                m_bDone = true;\r
                m_Animate.Stop();\r
                m_Progress.SetPos(100);\r
@@ -202,7 +224,14 @@ LRESULT CProgressDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam)
                        DialogEnableWindow(IDCANCEL, FALSE);\r
        }\r
 \r
-       if(lParam != 0)\r
+       if(lParam == 0)\r
+       {\r
+               for(int i=this->m_BufStart;i<this->m_Databuf.size();i++)\r
+               {\r
+                       ParserCmdOutput(this->m_Databuf[m_BufStart]);\r
+                       m_BufStart++;\r
+               }\r
+       }else\r
                ParserCmdOutput((TCHAR)lParam);\r
 \r
        return 0;\r
index b5f7dc7..eb8e423 100644 (file)
@@ -55,13 +55,15 @@ protected:
 \r
        void            OnCancel();\r
 \r
+       std::vector<TCHAR> m_Databuf;\r
+       int                     m_BufStart;\r
        \r
        DECLARE_MESSAGE_MAP()\r
 public:\r
 \r
        //Share with Sync Dailog\r
        static int      FindPercentage(CString &log);\r
-       static UINT  RunCmdList(CWnd *pWnd,std::vector<CString> &cmdlist,bool bShowCommand,CString *pfilename,bool *bAbort);\r
+       static UINT  RunCmdList(CWnd *pWnd,std::vector<CString> &cmdlist,bool bShowCommand,CString *pfilename,bool *bAbort,std::vector<TCHAR> *pdata=NULL);\r
 \r
        afx_msg void OnBnClickedOk();\r
        afx_msg void OnBnClickedButton1();\r