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

时间:2013-01-27 19:22:18

标签: c++ multithreading visual-c++ user-interface 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()来覆盖线程安全问题是否足够?

1 个答案:

答案 0 :(得分:0)

首先,您不应直接从工作线程调用UI。出于很多好的理由。

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

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