2011-11-28 26 views
0

使用ATL時,什麼是最好的方式來顯示後臺線程的進度(例如當它搜索文件時)而不會阻塞UI?在ATL中顯示後臺線程進度的最佳方法?

我仍然希望能夠處理消息,以允許取消按鈕,並可能允許用戶在搜索時繼續使用該程序。

回答

1

這裏沒有特定的ATL。其中一種方法是將進度細節更新到成員變量中,並將消息發佈到GUI窗口,然後通過從成員變量中拉取數據並更新GUI來處理消息,例如更新靜態和/或進度條。

工作線程的僞代碼:

m_DataCriticalSection.Lock(); 
m_nProgress = (INT) (nCurrent * 100/nTotal); 
m_DataCriticalSection.Unlock(); 
PostMessage(WM_MYUPDATEPROGRESS); 

窗口:

OnMyUpdateProgress() 
{ 
    m_DataCriticalSection.Lock(); 
    INT nProgress = m_nProgress; 
    m_DataCriticalSection.Unlock(); 
    m_ProgressBar.SetPos(nProgress); 
} 

UPD。一個real code snippetAddText被稱爲在後臺線程:

VOID AddText(const CString& sText) 
    { 
      _A(sText.Find(_T('\n')) < 0); 
      BOOL bIsTextEmpty; 
      { 
        CRoCriticalSectionLock TextLock(m_TextCriticalSection); 
        bIsTextEmpty = m_sText.IsEmpty(); 
        m_sText.Append(sText); 
        m_sText.Append(_T("\r\n")); 
      } 
      if(bIsTextEmpty) 
        PostPrivateMessage(WM_UPDATETEXT); 
    } 

而且the code handler

BEGIN_MSG_MAP_EX(CMainDialog) 
     // ... 
     MESSAGE_HANDLER_EX(WM_UPDATETEXT, OnUpdateText) 

    LRESULT OnUpdateText(UINT, WPARAM, LPARAM) 
    { 
      CString sText; 
      { 
        CRoCriticalSectionLock TextLock(m_TextCriticalSection); 
        sText = m_sText; 
        m_sText.Empty(); 
      } 
      if(!sText.IsEmpty()) 
      { 
        m_TextEdit.SetValue(m_TextEdit.GetValue() + sText); 
        const INT nTextLength = m_TextEdit.GetWindowTextLength(); 
        m_TextEdit.SetSel(nTextLength, nTextLength); 
      } 
      return 0; 
    } 

它使用自定義類(不是 '純粹的' ATL),但我希望你的想法。

+0

是的,我希望能有一些整齊的課程,我可以在ATL中使用,但是無論如何,謝謝。 – Mehrdad

相關問題