PostMessage和SendMessage的区别

PostMessage是一个异步行为,就是先把消息扔到对方的消息队列,然后沿着原调用点继续执行;

SendMessage是一个同步行为,就是等待对方把这个消息处理完再回到调用点继续执行。

      我想怎么测试这个结论呢?为此我设计了一个小试验:在视图中弹出一个非模式的帮助对话框,然后分别用PostMessage和SendMessage给这个对话框发消息,消息处理函数很简单,就是在视图上打印字符串。

  1. // 使用SendMessage给对话框发送自定义消息WM_ABOUTSENDMSG,然后打印5个"字符串来// 自视图窗口"的字符串  
  2. void CTestUnicodeView::OnTestSendmsg()  
  3. {  
  4.     // TODO: 在此添加命令处理程序代码  
  5.     int i = 0;  
  6.     // m_pAboutDlg为CAboutDlg类指针的变量  
  7.     ::SendMessage(m_pAboutDlg->GetSafeHwnd(),WM_ABOUTSENDMSG,(WPARAM)this->GetSafeHwnd(),(LPARAM)i);  
  8.     CDC *pDC = GetDC();  
  9.     for ( i = 0;i<5;i++)  
  10.     {  
  11.         CString str = _T("字符串来自视图窗口");  
  12.         CRect rt(0,120+i*20,200,140+i*20);  
  13.         pDC->DrawText(str,&rt,DT_CENTER);  
  14.         Sleep(2000); // 睡眠2秒,可以更好看到输出  
  15.     }  
  16.     ReleaseDC(pDC);  
  17. }  
  18. // 使用PostMessage给对话框发送自定义消息WM_ABOUTPOSTMSG,然后打印5个"字符串来// 自视图窗口"的字符串  
  19. void CTestUnicodeView::OnTestPostmsg()  
  20. {  
  21.     // TODO: 在此添加命令处理程序代码  
  22.     int i = 0;  
  23.     ::PostMessage(m_pAboutDlg->GetSafeHwnd(),WM_ABOUTPOSTMSG,(WPARAM)this->GetSafeHwnd(),(LPARAM)i);  
  24.     CDC *pDC = GetDC();  
  25.     for ( i = 0;i<5;i++)  
  26.     {  
  27.         CString str = _T("字符串来自视图窗口");  
  28.         CRect rt(0,120+i*20,200,140+i*20);  
  29.         pDC->DrawText(str,&rt,DT_CENTER);  
  30.         Sleep(2000); // 睡眠2秒,可以更好看到输出  
  31.     }  
  32.     ReleaseDC(pDC);  
  33. }  
  34. // WM_ABOUTSENDMSG消息的处理函数,在视图上打印5个"字符串来自对话框窗口"  
  35. LRESULT CAboutDlg::AboutSendMsg( WPARAM wp,LPARAM lp )  
  36. {  
  37.     HWND hView = (HWND)wp;  
  38.     int i = (int)lp;  
  39.     CTestUnicodeView *pView = dynamic_cast<CTestUnicodeView*>(CWnd::FromHandle(hView));  
  40.     CDC *pDC = pView->GetDC();  
  41.     for (i = 0;i<5;i++)  
  42.     {  
  43.         CString str = _T("字符串来自对话框窗口");  
  44.         CRect rt(0,i*20,200,20+i*20);  
  45.         pDC->DrawText(str,&rt,DT_CENTER);  
  46.         Sleep(2000); // 睡眠2秒,可以更好看到输出  
  47.     }  
  48.     pView->ReleaseDC(pDC);  
  49.     return 0;  
  50. }  
  51. // WM_ABOUTPOSTMSG消息处理函数,在视图上打印5个"字符串来自对话框窗口"  
  52. LRESULT CAboutDlg::AboutPostMsg( WPARAM wp,LPARAM lp )  
  53. {  
  54.     HWND hView = (HWND)wp;  
  55.     int i = (int)lp;  
  56.     CTestUnicodeView *pView = dynamic_cast<CTestUnicodeView*>(CWnd::FromHandle(hView));  
  57.     CDC *pDC = pView->GetDC();  
  58.     for (i = 0;i<5;i++)  
  59.     {  
  60.         CString str = _T("字符串来自对话框窗口");  
  61.         CRect rt(0,i*20,200,20+i*20);  
  62.         pDC->DrawText(str,&rt,DT_CENTER);  
  63.         Sleep(2000); // 睡眠2秒,可以更好看到输出  
  64.     }  
  65.     pView->ReleaseDC(pDC);  
  66.     return 0;  
  67. }  


     试验结果是使用SendMessage给对话框发送消息,先是依次输出5个"字符串来自对话框窗口",再依次输出5个"字符串来自视图窗口"。而使用PostMessage给对话框发送消息,结果相反,先依次输出5个"字符串来自视图窗口",再依次输出5个"字符串来自对话框窗口"。


发布了15 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u010281924/article/details/9323931
今日推荐