0
使用ATL時,什麼是最好的方式來顯示後臺線程的進度(例如當它搜索文件時)而不會阻塞UI?在ATL中顯示後臺線程進度的最佳方法?
我仍然希望能夠處理消息,以允許取消按鈕,並可能允許用戶在搜索時繼續使用該程序。
使用ATL時,什麼是最好的方式來顯示後臺線程的進度(例如當它搜索文件時)而不會阻塞UI?在ATL中顯示後臺線程進度的最佳方法?
我仍然希望能夠處理消息,以允許取消按鈕,並可能允許用戶在搜索時繼續使用該程序。
這裏沒有特定的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 snippet,AddText
被稱爲在後臺線程:
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);
}
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),但我希望你的想法。
是的,我希望能有一些整齊的課程,我可以在ATL中使用,但是無論如何,謝謝。 – Mehrdad