從工作線程訪問MFC控件的最佳方式是什麼?如何從工作線程訪問MFC控件?
什麼是訪問控件的MFC習慣用法?
我讀到這裏http://www.flounder.com/workerthreads.htm下面的辦法,但我不很喜歡的CString
的new
,我怎麼可以肯定的CString
會妥善deleted
?
typedef struct tagTP
{
HWND hwnd;
int n;
} TP;
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
// ...
ON_MESSAGE(UWM_UPDATE_RESULTS, OnUpdateResults)
END_MESSAGE_MAP()
void CMyDlg::OnBnClickedDoWork()
{
TP* tp = new TP;
tp->hwnd = m_hWnd;
tp->n = 42;
AfxBeginThread(doWork, tp);
}
UINT CMyDlg::doWork(LPVOID p)
{
TP* tp = reinterpret_cast< TP* >(p);
CWnd* dlg = FromHandle(tp->hwnd);
if (tp->n == 42) {
CString* s = new CString("Is the Answer to the Ultimate Question of Life, the Universe, and Everything");
dlg->PostMessage(UWM_UPDATE_STATUS, 0, reinterpret_cast<LPARAM>(s));
}
return 0;
}
LRESULT CMyDlg::OnUpdateResults(WPARAM,LPARAM lParam)
{
CString* s = reinterpret_cast<CString *>(lParam);
m_result.AddString(*s);// m_result is a CListBox
delete s;
UpdateData(FALSE);
return 0;
}
您應該將CString指針存儲在OnUpdateResults()中的智能指針中,以確保在處理過程中出現異常時它會被銷燬。 – tinman