使用 Visual Studio 2015(社区版)和 MFC C++ 项目。我有一个 worker 我希望使用 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;
...
}
请注意,为了紧扣主题,我缩写了其中的一些内容。
在调试这个(有比这更多的代码)时,我验证线程是否启动,我执行这个返回 true 的 PostMessage() 函数。我永远无法到达 旨在作为接收者的 OnResponse() 函数。我不知道 为什么..(??)..
一些想法。确实,类 MyComm 属于同一个类,但 不是对话框线程,但由它产生并派生自 CDialog。这 可能还不够??我承认,我对 MFC 的线程还是有点陌生 编程范式。如有任何帮助,我们将不胜感激。
疯狗
最佳答案
今天,我确实找到了这个问题的答案。
这是因为启动线程的类不是与某个线程绑定(bind)的类
窗口尚未,是由一个有窗口的窗口生成的。 pMyHndl 上的细微差别
是必要的。如果在 POSTMESSAGE()
中,我改为使用 pMyHndl->m_pParent
代替 m_pParent 指向父类(带有窗口的父类)的位置。
此代码正在接收消息,现在接收消息的代码
被移到那里。感谢大家的帮助。
疯狗
关于c++ - mfc c++ 将带有 postmessage 的自定义用户消息从工作线程发送到主 ui 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36414063/