将棋プログラミング

(将棋に関する)ソフトウェア開発のノウハウ等。

MFC:ワーカスレッドから UI を操作する

多くの OS では、ワーカスレッドから UI を操作できない。
例えば、Android では、AsyncTask の doInBackground から Toast.makeText を実行すると exception が発生する。

今回、MFC で、ワーカスレッドからツールバーを操作したとき、ツールバーが消えることを確認した。
こういった場合、SendMessage を使う方法を説明する。

#define WM_USER_MESSAGE_ID (WM_USER + ***) // 独自のメッセージID

// ワーカスレッド
UINT _cdecl thread(LPVOID pParam)
{
  // UI を操作する
  AfxGetApp()->m_pMainWnd->SendMessage(WM_USER_MESSAGE_ID, *, *L);

  return 0;
}

ON_MESSAGE(WM_USER_MESSAGE_ID, OnUserMessage)

// メッセージを受信
LRESULT ***::OnUserMessage(WPARAM wpara, LPARAM lpara)
{
  // UI を操作する

  return 0;
}