从工作线程访问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