我一直在读某个地方,将MFC ui控件作为句柄传递给线程更安全,而不是将指针传递给控件。
选项1 - 将指针传递给静态文本:
TestDialog dlg1;
::_beginthreadex(NULL, 0, &tSetTextByPointer, &dlg1.m_StaticText, 0, NULL);
dlg1.DoModal();
UINT WINAPI tSetTextByPointer(LPVOID arg)
{
CStatic * pStaticText = static_cast<CStatic*>(arg);
Sleep(3000);
pStaticText->SendMessage(WM_SETTEXT, 0, (LPARAM)L"text");
return 0;
}
选项2 - 传递句柄:
TestDialog dlg1;
::_beginthreadex(NULL, 0, &tSetTextByHandle, &(dlg1.m_StaticText.m_hWnd), 0, NULL);
dlg1.DoModal();
UINT WINAPI tSetTextByHandle(LPVOID arg)
{
HWND * pTextHandle = static_cast<HWND*>(arg);
Sleep(3000);
::SendMessage(*pTextHandle, WM_SETTEXT, 0, (LPARAM)L"text");
return 0;
}
在多线程访问控件时,我真的更喜欢使用句柄吗? 或者,在访问控件时依赖SendMessage()来覆盖线程安全问题是否足够?
答案 0 :(得分:0)
首先,您不应直接从工作线程调用UI。出于很多好的理由。
但是如果你确实需要这个,那么使用原始HWND会更安全。否则,您应该检查pStaticText->SendMessage
方法是否是线程安全的。
如果您使用VS2010及以上版本,我建议使用此方法: http://www.terrainformatica.com/2011/01/c0x-running-code-in-gui-thread-from-worker-threads/