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

时间:2016-04-04 22:31:12

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

使用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;
  ...
}

注意我将其中一些缩写为主题。

在调试它时(代码比这个多得多),我验证线程是否启动,我执行这个返回true的PostMessage()函数。我从来没有去过 打算作为收件人的OnResponse()函数。我不确定 为什么..(??)..

一些想法。确实,MyComm类属于同一类 不是对话框线程,而是由它产生并且是从CDialog派生的。这个 可能还不够?我承认,我通过MFC对线程仍然有些新意 编程范式。任何帮助表示赞赏。

Maddog

2 个答案:

答案 0 :(得分:0)

  • 线程完成后,变量xlWS.Range("A1").Select Dim rst as DAO.Recordset, fld as Variant Set rst = CurrentDB.OpenRecordset(TableOrQueryNameOrSELECTstatement) For Each fld In rst.Fields ApXL.Application.ActiveCell = fld.Name ApXL.Application.ActiveCell.Offset(0, 1).Select Next rst.MoveFirst xlWSh.Range("A2").CopyFromRecordset rst XlWb.Save将不存在。您显示的线程功能太小,很快就会退出。
  • 理想情况下,您应该从string s开始新的线程,而不是在构造函数中。消息循环不是在构造函数中创建的,而是在OnInitDialog
  • 中创建的
  • 检查消息代码是否正确。您的代码同时包含:OnInitDialogWM_USBRDRESPONSE

答案 1 :(得分:0)

今天,我确实找到了这个问题的答案。

这是因为启动线程的类不是绑定到的类 窗口,由一个窗口产生的窗口。 pMyHndl上的微妙细微差别 有必要的。如果在POSTMESSAGE()我改为使用pMyHndl->m_pParent 代替m_pParent指向Parent类的位置(一个带窗口)。 此代码现在接收消息,即接收消息的代码 被移到那里。感谢所有人的帮助。

maddog