zoukankan      html  css  js  c++  java
  • 用自定义消息在线程间通信(VC) Mr

    在多线程的程序中,有时需要在子线程中使用UpdateData()函数对主窗口进行更新,但是在子线程里调用UpdateData()函数是行不通的,这就需要使用自定义消息来进行线程间的通信,在此记录怎么使用自定义消息。
    在Visual C++中提供了WM_USER,比它大的整数可以由用户使用,比它小的整数由系统保留。

      自定义消息处理的过程如下:
      1、声明一个全局的常量,代码如下:
        const WM_xxx = WM_USER + N;
        其中,WM_xxx表示自定义的消息名,N是正整数。
      2、在对话框的头文件中DECLARE_MESSAGE_MAP()的前面添加下列语句:
        //{{AFX_MSG(CXXXDlg)
        ...
        afx_msg LONG OnXXXX(WPARAM wParam, LPARAM lParam); //消息处理函数的声明,OnXXXX可自行命名
        ...
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
      3、切换到对话框类的实现文件中,在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加消息映射代码:
        BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)
        //{{AFX_MSG_MAP(CQQDlg)
         ...
         ON_MESSAGE(WM_xxx,OnXXXX) //WM_xxx就是第1点中声明的全局常量,OnXXXX就是第2点声明的消息处理函数
         ...
         //}}AFX_MSG_MAP
        END_MESSAGE_MAP()
      4、在对话框类的实现文件中添加消息处理函数的实现代码,大致如下:
        LONG CXXXDlg::OnXXXX(WPARAM wParam, LPARAM lParam)
        {
          switch(wParam)
          {
            case 情况1:
            {
              UpdateData(lParam);  
              break;
            } 
            case 情况2:
            {
              //消息处理
              break;
            }
            .....
            default:
            break;
          }
        }
      5、现在就可以向主线程发送消息了,Windows提供了两个发送消息的函数:SendMessage和PostMessage。
        (1) SendMessage:该函数只有等消息被处理完以后才可以返回。其函数原型为:
          LRESULT SendMessage(HWND hWnd, UINT message, WPARAM wParam=0, LPARAM lParam=0);
            hWnd:其窗口程序接收消息的窗口的句柄。
            message:指定要发送的消息。
            wParam:指定额外消息依赖的信息。
            lParam:指定额外消息依赖的信息。
            LRESULT:表示一个窗口过程返回值的类型。
        (2) PostMessage:该函数将消息发送后就可以直接返回。其函数原型为:
          BOOL PostMessage(HWND hWnd, UINT message, WPARAM wParam=0, LPARAM lParam=0);
            hWnd:其窗口程序接收消息的窗口的句柄。
            message:指定要发送的消息。
            wParam:指定额外消息依赖的信息。
            lParam:指定额外消息依赖的信息。

    注:上面的WPARAM和LPARAM参数表示一个32位的值,将作为参数传递给响应Windows消息的函数。

    例如:
      PostMessage((HWND)(pQQDlg->GetSafeHwnd()), WM_xxx, 情况1, FALSE);

  • 相关阅读:
    Android Studio如何设置代码自动提示
    Java中Map的用法详解
    Android 管理Activity中的fragments
    Android
    WebApp之Meta标签
    iOS中为网站添加图标到主屏幕以及增加启动画面
    HTML5添加 video 视频标签后仍然无法播放的解决方法 IIS添加MIEI类型
    WebApp之 apple-touch-icon
    Eclipse编辑器基本设置
    Redis监控方案
  • 原文地址:https://www.cnblogs.com/miaohw/p/2147361.html
Copyright © 2011-2022 走看看