热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用自定义消息在线程间通信(VC)

在多线程的程序中,有时需要在子线程中使用UpdateData()函数对主窗口进行更新,但是在子线程里调用UpdateData()函数是行不通的ÿ

在多线程的程序中,有时需要在子线程中使用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);


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了PHP常量的定义和使用方法,包括常量的命名规则、大小写敏感性、全局范围和标量数据的限制。同时还提到了应尽量避免定义resource常量,并给出了使用define()函数定义常量的示例。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
author-avatar
菜菜ING
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有