Visual Studio 2015(Community Edition)を使用& MFC C++プロジェクト。私は作業者 私はPostMessage()関数を使用してこのスレッドからメインUIスレッド(ここで私のCDialogが存在する)にデータを送信したいのですが、同じクラスの私は がこのメッセージを受け取りたいと思っています。 MyComm.hファイルでmfc C++ postmessageを使用したカスタムメッセージを作業スレッドからメインUIスレッドに送信
、私は次のようしている:私のMyComm.cppファイルで
#define WM_USERRESPONSE WM_APP + 2000
class MyComm: public CDialog
{
...
CWnd* m_pParent;
static BOOL m_bThreadKill;
static CWinThread* pThread;
static CEvent* pEvent;
static CEvent m_ThreadKillEvent;
...
static UINT MyThreadProc(LPVOID pParam);
...
afx_msg LRESULT OnResponse(WPARAM wParam, LPARAM lParam);
...
};
、私は次のようしている:
MyComm::MyComm(CWnd* pParent /*=NULL*/)
: CDialog(IDD_PPAGE_COMMAND, pParent)
{
m_pParent = pParent;
pEvent = new CEvent(FALSE, FALSE);
if ((pThread = AfxBeginThread(MyThreadProc, this)) == NULL)
AfxMessageBox("Could not Create Read Thread!");
pThread->m_bAutoDelete = FALSE;
m_ThreadKillEvent.ResetEvent();
m_ReadThreadDead.ResetEvent();
running = 1;
}
UINT MyComm::MyThreadProc(LPVOID pParam)
{
MyComm *pMyHndl = ((MyComm*)pParam);
string s = "I would like this string posted";
BOOL b = false;
b = ::PostMessage(pMyHndl->GetSafeHwnd(), WM_USBRDRESPONSE, 0,
(LPARAM)&s);
}
BEGIN_MESSAGE_MAP(MyComm, CDialog)
ON_MESSAGE(WM_USERRESPONSE, &MyComm::OnResponse)
END_MESSAGE_MAP()
afx_msg LRESULT MyComm::OnResponse(WPARAM wParam, LPARAM lParam)
{
MyStruct* p = (MyStruct*)lParam;
...
}
注私が滞在してこの一部を省略トピックに関する
これよりも多くのコードがありますが、スレッドを開始したことを確認して、このPostMessage()関数を実行してtrueを返します。私は に、受信者を対象としたOnResponse()関数を使用することはありません。私は確信していません なぜ..(??)..
いくつかの考え。 MyCommクラスが同じクラスにあり、ダイアログスレッドではなく であることは確かですが、それはまだそれによって生成されており、CDialogから派生しています。この は十分でないかもしれませんか?私はまだ、MFC プログラミングパラダイムを介してスレッドに少し新しいことを認めます。どんな助けもありがとうございます。
Maddog
配信の問題を引き起こしませんが、メッセージが配信されたときに文字列 's'は存在しますか? MyThreadProc()が返ってきたら、それはRAIIでなくなってしまいますか? –
申し訳ありませんが、実際のコードではスレッドは返されません(つまり、(1)...)または終了するまで。 –
私の場合、この文字列は、スレッドが生成されたときに作成されるバッファです。 –