From 482b337470613afbd5d68f14dedf62917cac0e8d Mon Sep 17 00:00:00 2001 From: Frank Li Date: Sat, 22 May 2010 22:44:35 +0800 Subject: [PATCH] Fixed issue #438: Slow load Switch/Checkout dialog Create Thread at back ground to load tag and branch to avoid dialog loading slow when there are many tags (above 1000) Signed-off-by: Frank Li --- src/TortoiseProc/ChooseVersion.h | 65 +++++++++++++++++++++++++++------ src/TortoiseProc/CreateBranchTagDlg.cpp | 9 +++++ src/TortoiseProc/CreateBranchTagDlg.h | 1 + src/TortoiseProc/ExportDlg.cpp | 9 +++++ src/TortoiseProc/ExportDlg.h | 1 + src/TortoiseProc/GitSwitchDlg.cpp | 9 +++++ src/TortoiseProc/GitSwitchDlg.h | 1 + src/TortoiseProc/MergeDlg.cpp | 9 +++++ src/TortoiseProc/MergeDlg.h | 1 + src/Utils/MiscUI/HistoryCombo.cpp | 9 +++-- src/Utils/MiscUI/HistoryCombo.h | 4 +- 11 files changed, 100 insertions(+), 18 deletions(-) diff --git a/src/TortoiseProc/ChooseVersion.h b/src/TortoiseProc/ChooseVersion.h index 2bc641624..4f790752d 100644 --- a/src/TortoiseProc/ChooseVersion.h +++ b/src/TortoiseProc/ChooseVersion.h @@ -2,6 +2,7 @@ #include "afxwin.h" #include "LogDlg.h" #include "BrowseRefsDlg.h" +#include "MessageBox.h" class CChooseVersion { @@ -10,10 +11,19 @@ public: private: CWnd * m_pWin; + CWinThread* m_pLoadingThread; + static UINT LoadingThreadEntry(LPVOID pVoid) + { + return ((CChooseVersion*)pVoid)->LoadingThread(); + }; + volatile LONG m_bLoadingThreadRunning; + protected: CHistoryCombo m_ChooseVersioinBranch; CHistoryCombo m_ChooseVersioinTags; CHistoryCombo m_ChooseVersioinVersion; + CButton m_RadioBranch; + CButton m_RadioTag; //Notification when version changed. Can be implemented in derived classes. virtual void OnVersionChanged(){} @@ -135,27 +145,56 @@ protected: OnVersionChanged(); } - - void Init() - { - m_ChooseVersioinBranch.SetMaxHistoryItems(0x7FFFFFFF); - m_ChooseVersioinTags.SetMaxHistoryItems(0x7FFFFFFF); - + UINT LoadingThread() + { STRING_VECTOR list; - g_Git.GetTagList(list); - m_ChooseVersioinTags.AddString(list); - - list.clear(); + int current; g_Git.GetBranchList(list,¤t,CGit::BRANCH_ALL); - m_ChooseVersioinBranch.AddString(list); + m_ChooseVersioinBranch.AddString(list, false); m_ChooseVersioinBranch.SetCurSel(current); + m_RadioBranch.EnableWindow(TRUE); + + list.clear(); + g_Git.GetTagList(list); + m_ChooseVersioinTags.AddString(list, false); + m_ChooseVersioinTags.SetCurSel(0); + + m_RadioTag.EnableWindow(TRUE); if(m_initialRefName.IsEmpty()) OnVersionChanged(); else SelectRef(m_initialRefName); + + InterlockedExchange(&m_bLoadingThreadRunning, FALSE); + return 0; + } + void Init() + { + m_ChooseVersioinBranch.SetMaxHistoryItems(0x7FFFFFFF); + m_ChooseVersioinTags.SetMaxHistoryItems(0x7FFFFFFF); + + m_RadioBranch.EnableWindow(FALSE); + m_RadioTag.EnableWindow(FALSE); + + InterlockedExchange(&m_bLoadingThreadRunning, TRUE); + + if ( (m_pLoadingThread=AfxBeginThread(LoadingThreadEntry, this)) ==NULL) + { + InterlockedExchange(&m_bLoadingThreadRunning, FALSE); + CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR); + } + } + void WaitForFinishLoading() + { + if(m_bLoadingThreadRunning && m_pLoadingThread) + { + DWORD ret =::WaitForSingleObject(m_pLoadingThread->m_hThread,20000); + if(ret == WAIT_TIMEOUT) + ::TerminateThread(m_pLoadingThread,0); + } } public: CString m_VersionName; @@ -170,7 +209,9 @@ public: #define CHOOSE_VERSION_DDX \ DDX_Control(pDX, IDC_COMBOBOXEX_BRANCH, m_ChooseVersioinBranch); \ DDX_Control(pDX, IDC_COMBOBOXEX_TAGS, m_ChooseVersioinTags); \ - DDX_Control(pDX, IDC_COMBOBOXEX_VERSION, m_ChooseVersioinVersion); + DDX_Control(pDX, IDC_COMBOBOXEX_VERSION, m_ChooseVersioinVersion); \ + DDX_Control(pDX, IDC_RADIO_BRANCH, m_RadioBranch);\ + DDX_Control(pDX, IDC_RADIO_TAGS, m_RadioTag); #define CHOOSE_VERSION_EVENT\ ON_BN_CLICKED(IDC_RADIO_HEAD, OnBnClickedChooseRadioHost)\ diff --git a/src/TortoiseProc/CreateBranchTagDlg.cpp b/src/TortoiseProc/CreateBranchTagDlg.cpp index 84cc708b2..ae2948c3d 100644 --- a/src/TortoiseProc/CreateBranchTagDlg.cpp +++ b/src/TortoiseProc/CreateBranchTagDlg.cpp @@ -45,6 +45,7 @@ BEGIN_MESSAGE_MAP(CCreateBranchTagDlg, CResizableStandAloneDialog) ON_BN_CLICKED(IDOK, &CCreateBranchTagDlg::OnBnClickedOk) ON_CBN_SELCHANGE(IDC_COMBOBOXEX_BRANCH, &CCreateBranchTagDlg::OnCbnSelchangeComboboxexBranch) // ON_BN_CLICKED(IDC_BUTTON_BROWSE_REF, &CCreateBranchTagDlg::OnBnClickedButtonBrowseRef) +ON_WM_DESTROY() END_MESSAGE_MAP() BOOL CCreateBranchTagDlg::OnInitDialog() @@ -166,3 +167,11 @@ void CCreateBranchTagDlg::OnVersionChanged() else GetDlgItem(IDC_CHECK_TRACK)->EnableWindow(FALSE); } + +void CCreateBranchTagDlg::OnDestroy() +{ + WaitForFinishLoading(); + __super::OnDestroy(); + + // TODO: Add your message handler code here +} diff --git a/src/TortoiseProc/CreateBranchTagDlg.h b/src/TortoiseProc/CreateBranchTagDlg.h index 0f8ea5906..1efe6a865 100644 --- a/src/TortoiseProc/CreateBranchTagDlg.h +++ b/src/TortoiseProc/CreateBranchTagDlg.h @@ -38,4 +38,5 @@ public: afx_msg void OnCbnSelchangeComboboxexBranch(); virtual void OnVersionChanged(); + afx_msg void OnDestroy(); }; diff --git a/src/TortoiseProc/ExportDlg.cpp b/src/TortoiseProc/ExportDlg.cpp index 97330a00a..8a584be66 100644 --- a/src/TortoiseProc/ExportDlg.cpp +++ b/src/TortoiseProc/ExportDlg.cpp @@ -62,6 +62,7 @@ BEGIN_MESSAGE_MAP(CExportDlg, CResizableStandAloneDialog) ON_BN_CLICKED(IDHELP, OnBnClickedHelp) CHOOSE_VERSION_EVENT + ON_WM_DESTROY() END_MESSAGE_MAP() BOOL CExportDlg::OnInitDialog() @@ -226,3 +227,11 @@ void CExportDlg::OnCbnEditchangeUrlcombo() m_strExportDirectory = m_sExportDirOrig+_T('\\')+name; UpdateData(FALSE); } + +void CExportDlg::OnDestroy() +{ + WaitForFinishLoading(); + __super::OnDestroy(); + + // TODO: Add your message handler code here +} diff --git a/src/TortoiseProc/ExportDlg.h b/src/TortoiseProc/ExportDlg.h index 8da39610f..8d9c2818a 100644 --- a/src/TortoiseProc/ExportDlg.h +++ b/src/TortoiseProc/ExportDlg.h @@ -83,4 +83,5 @@ public: CFileDropEdit m_cCheckoutEdit; CLogDlg * m_pLogDlg; //svn_depth_t m_depth; + afx_msg void OnDestroy(); }; diff --git a/src/TortoiseProc/GitSwitchDlg.cpp b/src/TortoiseProc/GitSwitchDlg.cpp index 02ddc1c4e..5d84f9dbc 100644 --- a/src/TortoiseProc/GitSwitchDlg.cpp +++ b/src/TortoiseProc/GitSwitchDlg.cpp @@ -45,6 +45,7 @@ BEGIN_MESSAGE_MAP(CGitSwitchDlg, CResizableStandAloneDialog) ON_BN_CLICKED(IDC_CHECK_BRANCH, &CGitSwitchDlg::OnBnClickedCheckBranch) ON_BN_CLICKED(IDOK, &CGitSwitchDlg::OnBnClickedOk) ON_CBN_SELCHANGE(IDC_COMBOBOXEX_BRANCH, &CGitSwitchDlg::OnCbnSelchangeComboboxexBranch) + ON_WM_DESTROY() END_MESSAGE_MAP() BOOL CGitSwitchDlg::OnInitDialog() @@ -166,3 +167,11 @@ void CGitSwitchDlg::OnCbnSelchangeComboboxexBranch() else this->GetDlgItem(IDC_CHECK_TRACK)->EnableWindow(FALSE); } + +void CGitSwitchDlg::OnDestroy() +{ + WaitForFinishLoading(); + __super::OnDestroy(); + + // TODO: Add your message handler code here +} diff --git a/src/TortoiseProc/GitSwitchDlg.h b/src/TortoiseProc/GitSwitchDlg.h index 31ac461ce..64d14ed19 100644 --- a/src/TortoiseProc/GitSwitchDlg.h +++ b/src/TortoiseProc/GitSwitchDlg.h @@ -36,4 +36,5 @@ protected: public: afx_msg void OnBnClickedCheckBranch(); afx_msg void OnCbnSelchangeComboboxexBranch(); + afx_msg void OnDestroy(); }; diff --git a/src/TortoiseProc/MergeDlg.cpp b/src/TortoiseProc/MergeDlg.cpp index 04c3699c6..9977f0404 100644 --- a/src/TortoiseProc/MergeDlg.cpp +++ b/src/TortoiseProc/MergeDlg.cpp @@ -64,6 +64,7 @@ void CMergeDlg::DoDataExchange(CDataExchange* pDX) BEGIN_MESSAGE_MAP(CMergeDlg, CResizableStandAloneDialog) CHOOSE_VERSION_EVENT ON_BN_CLICKED(IDOK, &CMergeDlg::OnBnClickedOk) + ON_WM_DESTROY() END_MESSAGE_MAP() @@ -122,3 +123,11 @@ void CMergeDlg::OnBnClickedOk() OnOK(); } + +void CMergeDlg::OnDestroy() +{ + WaitForFinishLoading(); + __super::OnDestroy(); + + // TODO: Add your message handler code here +} diff --git a/src/TortoiseProc/MergeDlg.h b/src/TortoiseProc/MergeDlg.h index eae6eff8a..1682d485a 100644 --- a/src/TortoiseProc/MergeDlg.h +++ b/src/TortoiseProc/MergeDlg.h @@ -58,4 +58,5 @@ public: CString m_strLogMesage; afx_msg void OnBnClickedOk(); + afx_msg void OnDestroy(); }; diff --git a/src/Utils/MiscUI/HistoryCombo.cpp b/src/Utils/MiscUI/HistoryCombo.cpp index 8f5a903f3..c75310b0b 100644 --- a/src/Utils/MiscUI/HistoryCombo.cpp +++ b/src/Utils/MiscUI/HistoryCombo.cpp @@ -88,7 +88,7 @@ BEGIN_MESSAGE_MAP(CHistoryCombo, CComboBoxEx) ON_WM_CREATE() END_MESSAGE_MAP() -int CHistoryCombo::AddString(CString str, INT_PTR pos) +int CHistoryCombo::AddString(CString str, INT_PTR pos,BOOL isSel) { if (str.IsEmpty()) return -1; @@ -165,7 +165,8 @@ int CHistoryCombo::AddString(CString str, INT_PTR pos) m_arEntries.RemoveAt(m_nMaxHistoryItems); } - SetCurSel(nRet); + if(isSel) + SetCurSel(nRet); return nRet; } @@ -320,11 +321,11 @@ void CHistoryCombo::SetMaxHistoryItems(int nMaxItems) for (int n = m_nMaxHistoryItems; n < nNumItems; n++) DeleteString(m_nMaxHistoryItems); } -void CHistoryCombo::AddString(STRING_VECTOR &list) +void CHistoryCombo::AddString(STRING_VECTOR &list,BOOL isSel) { for(unsigned int i=0;i