c++ - mfc c++ 将带有 postmessage 的自定义用户消息从工作线程发送到主 ui 线程

标签 c++ multithreading mfc visual-studio-2015 postmessage

使用 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/

相关文章:

java - SwingWorker 的基本原理是什么?

mfc - 对于带有 ActiveX 控件的对话框,CDialog::Create 失败

c++ - 向 MFC DLL 添加自动化支持

c++ - c++中swap是如何实现的

C++ 回调 - 未解析的外部符号

java - 在保持同步的同时调度线程 - java

multithreading - 授予对 std::mutex 的优先访问权

c++ - 在 MFC 应用程序中动态创建控件

c++ - 如何用基于函数的值填充 const std::array<size_t, N>

c++ - 使用 find_if 查找结构内部的 int for std::list with structs