热门标签 | 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);


推荐阅读
  • 线程漫谈——线程基础
    本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。进程与线程理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
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社区 版权所有