[英]mfc c++ send a custom user message with postmessage from a working thread to main ui thread
使用Visual Studio 2015(社区版)和MFC C ++项目。 我有一个工作线程,我希望使用PostMessage()函数将数据从该线程发送到主UI线程(我的CDialog所在的位置),但仍在同一类中,我想接收此消息。
在MyComm.h文件中,我具有以下内容:
#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.cpp文件中,我具有以下内容:
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编程范例,我对线程还是有些陌生。 任何帮助表示赞赏。
疯狗
string s
将不存在。 您显示的线程函数太小,将很快退出。 OnInitDialog
而不是在构造函数中启动新线程。 消息循环不是在构造函数中创建的,而是在OnInitDialog
。 WM_USBRDRESPONSE
和WM_USBRDRESPONSE
今天,我确实找到了这个问题的答案。
这是因为启动线程的类还不是与窗口绑定的类,而是由带有窗口的类生成的。 因此,对pMyHndl
的细微差别是必要的。 如果在POSTMESSAGE()
我改为使用pMyHndl->m_pParent
代替m_pParent指向Parent类的位置(一个带窗口的位置)。 现在,此代码正在接收消息,因为接收消息的代码已移动到那里。 谢谢各位的帮助。
疯狗
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.