2

コントロールにポインターを渡すよりも、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() に依存するだけで十分ですか?

4

1 に答える 1

0

まず第一に、ワーカースレッドから直接UIを呼び出さないでください。多くの正当な理由があります。

ただし、これが必要な場合は、生のHWNDを使用する方が安全です。それ以外の場合は、pStaticText->SendMessageメソッドがスレッドセーフかどうかを確認する必要があります。

VS2010以降を使用している場合は、次のアプローチを使用することをお勧めします: http ://www.terrainformatica.com/2011/01/c0x-running-code-in-gui-thread-from-worker-threads/

于 2013-01-27T19:57:47.557 に答える