将 MFC 控件传递给线程或传递句柄



我一直在某处读到,将 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() 来涵盖线程安全问题就足够了?

首先,不应直接从工作线程调用 UI。有很多充分的理由。

但是,如果您确实需要这个,那么使用原始 HWND 会更安全。否则,您应该检查pStaticText->SendMessage方法是否线程安全。

如果您使用的是VS2010及更高版本,我建议您使用此方法:http://www.terrainformatica.com/2011/01/c0x-running-code-in-gui-thread-from-worker-threads/

最新更新