gpt4 book ai didi

c++ - 如何从工作线程访问 MFC 控件?

转载 作者:太空宇宙 更新时间:2023-11-04 14:21:36 25 4
gpt4 key购买 nike

从工作线程访问 MFC 控件的最佳方法是什么?

访问控件的 MFC 惯用方式是什么?

我在这里阅读http://www.flounder.com/workerthreads.htm以下方法,但我不太喜欢 CStringnew,我怎么能确定 CString 是正确的 删除?

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;
}

最佳答案

使用 PostMessage(..)是正确的。考虑使用 SendMessage(..) - 哪个 block 直到完成。传递指向新对象的指针很常见 - 检查 PostMessage(..) 的返回值以检查它是否已发布。

how can I be sure the CString will be properly deleted ?

如前所述,检查 PostMessage(..) 的返回值并在退出消息循环的情况下处理整个消息队列。

关于c++ - 如何从工作线程访问 MFC 控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7190087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com