none
SendMessage 没有返回 RRS feed

  • 问题

  • 相关代码如下:

    #define MSG_TST (WM_USER + 500)
    class CDLG: public CDialog
    {
     ...
    public:
     static UINT NEWDLGThread(CDLG* pThis)
     {
      pThis->DoModal();
      return 0;
     }
     void NewDlg(void)
     {
      ::AfxBeginThread((AFX_THREADPROC)NEWDLGThread, this);
     }
     afx_msg LRESULT OnMsgTst(WPARAM, LPARAM);
    };

    CDLG dlg;
    dlg.NewDlg();

    遇到的问题是调用:dlg.SendMessage(MSG_TST);时,消息响应函数OnMsgTst已经返回,但dlg.SendMessage(MSG_TST);没有返回,不知问题出在何处...

    2010年7月12日 10:29

答案

  • 不要跨线程使用MFC窗口

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 MZHA 2010年7月13日 1:57
    2010年7月12日 19:34
    版主
  • 跨线程的时候不要传递MFC窗口对象,原因那篇文章已经说明。窗口句柄是线程安全的,可以跨线程使用。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 MZHA 2010年7月13日 1:57
    2010年7月13日 1:33
    版主

全部回复

  • 遇到的问题是调用:dlg.SendMessage(MSG_TST);时,消息响应函数OnMsgTst已经返回,但dlg.SendMessage(MSG_TST);没有返回,不知问题出在何处...

    不好意思,问题实在是没看懂, 能再详细描述一下吗?
    2010年7月12日 12:21
    版主
  • 使用AfxBeginThread创建一个线程T,在线程T中调用CDialog::DoModal()打开一个对话框;再用SendMessage给这个对话框发送消息,消息响应函数返回后,SendMessage没有返回。
    2010年7月12日 12:32
  • 就是上面那段代码中OnMsgTst是消息MSG_TST的响应函数,当调用SendMessage发送消息MSG_TST给在新线程中打开的对话框时,SendMessage等待OnMsgTst执行完毕,但OnMsgTst执行完毕后,SendMessage还没有结束,还一直在等待OnMsgTst...,导致调用SendMessage发送消息的线程一直被“被阻塞”。
    2010年7月12日 12:44
  • 不要跨线程使用MFC窗口

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 MZHA 2010年7月13日 1:57
    2010年7月12日 19:34
    版主
  • 不好意思,请说的详细些。

    是说基于MFC的程序只能主线程有窗口,其他线程都不能有窗口,还是其他什么意思?

    我现在使用MFC基于对话框的程序,需要有3个窗口,每个窗口又都有多个弹出窗口,在某些弹出窗口中可能会导致线程被阻塞,但主窗口又需要能及时响应其它进程发送来的消息(当把三个非模态窗口全放到主线程里时,主窗口的消息响应好像有点慢,但我不确定),所以我在主窗口初始化时创建了3个线程用于处理3个模态窗口及其弹出窗口,但主窗口的某些消息响应是控制其它3个窗口及其弹出窗口的...

    请问我该怎么做呢?

     

    2010年7月13日 1:24
  • 跨线程的时候不要传递MFC窗口对象,原因那篇文章已经说明。窗口句柄是线程安全的,可以跨线程使用。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 MZHA 2010年7月13日 1:57
    2010年7月13日 1:33
    版主
  • 不好意思,我没注意到那是个链接,所以...

    谢谢啊!

    2010年7月13日 1:49