当前位置: 首页 > news >正文

visual studio 2005的MFC各种线程函数之间的调用关系

在 Visual Studio 2005 的 MFC 程序中的函数和消息机制涉及线程间通信、消息处理以及与窗口消息的交互。接下来我将详细分析以下每个函数的作用、如何使用它们以及它们之间的调用关系。

1. PostThreadMessage(m_iThOpID, MSG_OP_OVER, 0, (LPARAM)iLparm);

  • 函数用途PostThreadMessage 是一个用于向指定线程发送消息的函数。它允许一个线程将消息发送到另一个线程的消息队列。消息可以是自定义的,也可以是系统定义的消息。

  • 参数分析

    • m_iThOpID:目标线程的标识符(线程ID)。该线程ID指示了消息将发送到哪个线程。
    • MSG_OP_OVER:消息的类型。这是一个自定义的消息标识符,表示某种操作完成的消息。通常这类消息会在程序中定义一个宏或枚举。
    • 0:该参数是 wParam,它可以传递任何需要传递的附加数据。这里传递的是 0,意味着没有附加的参数。
    • (LPARAM)iLparmlParam 是指向附加数据的指针或数据本身,这里使用的是 iLparm 变量,这意味着传递一个整数值作为附加参数。
  • 如何使用: 该函数通常用于在多线程应用程序中发送线程间的通知。它将消息放入目标线程的消息队列,目标线程可以在合适的时机使用 GetMessagePeekMessage 等函数来获取和处理该消息。

  • 典型应用场景: 假设你有一个主线程和一个工作线程。工作线程完成某个任务后,可能会向主线程发送一个消息,通知主线程操作完成,这时可以使用 PostThreadMessage 发送类似 MSG_OP_OVER 的消息。

2. PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);

  • 函数用途PeekMessage 用于从消息队列中检索消息。如果消息队列中有消息,PeekMessage 会将消息提取出来并返回,但不会阻塞当前线程。如果没有消息,它会立即返回。

  • 参数分析

    • &msg:指向 MSG 结构体的指针,用于接收提取的消息内容。
    • NULL:指定窗口句柄。NULL 表示从当前线程的消息队列中获取消息。
    • 0, 0:指定消息范围。0 表示接受所有类型的消息。
    • PM_REMOVE:表示在检索消息之后从队列中删除该消息。
  • 如何使用PeekMessage 通常用于消息循环中,当你不希望阻塞线程时使用。比如,在后台线程中可以调用 PeekMessage 进行非阻塞的消息处理,检查并处理消息。

  • 典型应用场景

    • 在主窗口的消息循环中,PeekMessage 被用来检查并处理消息。如果没有消息需要处理,程序可以继续执行其他任务。
    • 在多线程程序中,后台线程可以使用 PeekMessage 检查是否有来自主线程的消息,及时响应。

3. m_pDlgFather->SendMessage(WM_TRANSPORT_AUTO, 1, atoi(str));

  • 函数用途SendMessage 用于发送消息到指定窗口(在这个例子中是一个对话框窗口)。这个函数会阻塞当前线程,直到目标窗口处理完该消息。

  • 参数分析

    • WM_TRANSPORT_AUTO:这是一个自定义的消息标识符,表示某种与自动传输相关的操作。
    • 1:这是 wParam,它是消息的附加数据,通常用于传递整数值。
    • atoi(str):将字符串 str 转换为整数并作为 lParam 传递,lParam 用于传递额外的参数。
  • 如何使用SendMessage 用于发送消息到目标窗口,并等待该窗口处理完消息后返回结果。它适用于需要同步处理的场景。

  • 典型应用场景: 假设你的应用程序中有一个自动传输的操作,主窗口需要通知父窗口执行某个传输操作。这时,你可以使用 SendMessage 发送 WM_TRANSPORT_AUTO 消息,并携带相关数据。

4. ON_MESSAGE(WM_TRANSPORT_AUTO, OnAutoTansportMessage)

  • 函数用途ON_MESSAGE 是 MFC 中的一个宏,它用于将特定消息与消息处理函数进行绑定。它的作用是将指定的消息映射到处理该消息的成员函数。

  • 参数分析

    • WM_TRANSPORT_AUTO:这是消息标识符,表示该消息与自动传输操作相关。
    • OnAutoTansportMessage:这是消息处理函数的名称。当消息 WM_TRANSPORT_AUTO 被发送到窗口时,OnAutoTansportMessage 函数会被调用。
  • 如何使用: 在 MFC 中,消息映射是通过在类中使用 ON_MESSAGE 宏来完成的。消息映射是将消息和相应的消息处理函数联系起来的机制。当收到指定的消息时,相应的函数会被调用并处理消息。

  • 典型应用场景: 当你在主窗口或者对话框窗口中收到 WM_TRANSPORT_AUTO 消息时,MFC 会自动调用 OnAutoTansportMessage 函数来处理这个消息,进行自动传输相关的操作。

函数间的调用关系:

  1. 线程间通信
    • PostThreadMessage(m_iThOpID, MSG_OP_OVER, 0, (LPARAM)iLparm) 用于发送消息到另一个线程(如工作线程),通知它某个操作已经完成。
  2. 消息循环与消息处理
    • PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) 允许当前线程检查是否有消息待处理。如果有,它会从队列中提取并处理消息。如果没有,它会继续执行其他操作。
  3. 父窗口消息处理
    • m_pDlgFather->SendMessage(WM_TRANSPORT_AUTO, 1, atoi(str)) 将消息 WM_TRANSPORT_AUTO 发送给父窗口或对话框,通知它进行自动传输操作。
  4. 消息映射与消息处理函数
    • ON_MESSAGE(WM_TRANSPORT_AUTO, OnAutoTansportMessage)WM_TRANSPORT_AUTO 消息与 OnAutoTansportMessage 函数绑定。当消息到达时,OnAutoTansportMessage 会被调用并处理该消息。

总结:

  • PostThreadMessage 用于线程间的消息传递,通常用于一个线程通知另一个线程某个操作的完成。
  • PeekMessage 用于在消息队列中检索消息,常用于非阻塞式的消息循环。
  • SendMessage 用于发送消息到窗口,并等待窗口处理完消息后返回,通常用于同步操作。
  • ON_MESSAGE 是 MFC 中的消息映射宏,将消息和对应的处理函数绑定起来。

这些函数和消息机制通常结合使用,尤其在多线程和消息驱动的应用程序中,确保各个线程之间能够有效地沟通并处理异步事件。

相关文章:

visual studio 2005的MFC各种线程函数之间的调用关系

在 Visual Studio 2005 的 MFC 程序中的函数和消息机制涉及线程间通信、消息处理以及与窗口消息的交互。接下来我将详细分析以下每个函数的作用、如何使用它们以及它们之间的调用关系。 1. PostThreadMessage(m_iThOpID, MSG_OP_OVER, 0, (LPARAM)iLparm); 函数用途&#xff1…...

网页中调用系统的EXE文件,如打开QQ

遇到一个实际的问题,需要在网页中打开本地的某个工业软件。 通过点击exe文件就可以调用到程序。 比如双击qq的exe就可以启动qq的程序。 那么问题就变成了如何加载exe程序呢? 可以通过Java的 Process process Runtime.getRuntime().exec(command);通过…...

【单点知识】基于PyTorch讲解自动编码器(Autoencoder)

文章目录 0. 前言1. 自动编码器的基本概念1.1 定义1.2 目标1.3 结构 2. PyTorch实现自动编码器2.1 导入必要的库2.2 定义自动编码器模型2.3 加载数据2.4 训练自动编码器 3. 自动编码器的意义4. 自动编码器的应用4.1 图像处理4.2自然语言处理:4.3推荐系统&#xff1a…...

Halo 正式开源: 使用可穿戴设备进行开源健康追踪

在飞速发展的可穿戴技术领域,我们正处于一个十字路口——市场上充斥着各式时尚、功能丰富的设备,声称能够彻底改变我们对健康和健身的方式。 然而,在这些光鲜的外观和营销宣传背后,隐藏着一个令人担忧的现实:大多数这些…...

summernote富文本批量上传音频,视频等附件

普通项目,HTML的summernote富文本批量上传音频,视频等附件(其他附件同理) JS和CSS的引入 <head><th:block th:include"include :: summernote-css" /> </head> <body><th:block th:include"include :: summernote-js" /> …...

IDEA如何设置编码格式,字符编码,全局编码和项目编码格式

前言 大家好&#xff0c;我是小徐啊。我们在开发Java项目&#xff08;Springboot&#xff09;的时候&#xff0c;一般都是会设置好对应的编码格式的。如果设置的不恰当&#xff0c;容易造成乱码的问题&#xff0c;这是要避免的。今天&#xff0c;小徐就来介绍下我们如何在IDEA…...

【计算机网络实验】之静态路由配置

【计算机网络实验】之静态路由配置 实验题目实验目的实验任务实验设备实验环境实验步骤路由器配置设置静态路由测试路由器之间的连通性配置主机PC的IP测试 实验题目 静态路由协议的配置 实验目的 熟悉路由器工作原理和机制&#xff1b;巩固静态路由理论&#xff1b;设计简单…...

十五届蓝桥杯赛题-c/c++ 大学b组

握手问题 很简单&#xff0c;相互牵手即可&#xff0c;但是要注意&#xff0c;第一个人只能与其他49个人牵手&#xff0c;所以开头是加上49 #include <iostream> using namespace std; int main() {int cnt0;for(int i49;i>7;i--){cnti;//cout<<i<<&quo…...

基础自动化系统的任务

基础自动化系统的任务主要包括实现自动控制、提高生产效率、减少人工干预等。以下是其具体任务的相关介绍&#xff1a; 实现自动控制 控制机器设备&#xff1a;基础自动化系统通过预设的程序和逻辑规则&#xff0c;对机器或设备进行自动控制和运行。执行特定任务&#xff1a;这…...

DBeaver添加地图查看器的自定义底图

DBeaver提供了空间数据在地图上查看的功能&#xff0c;地图查看器技术上基于Leaflet实现。 当我们在表格中选择图形列时&#xff0c;空间数据会叠加在右侧的地图查看器上。 其本质是在缓存中会生成一个静态页面&#xff0c;点击查看器左下角的“在浏览器中打开”&#xff0c;可…...

STM32F103C8T6实时时钟RTC

目录 前言 一、RTC基本硬件结构 二、Unix时间戳 2.1 unix时间戳定义 2.2 时间戳与日历日期时间的转换 2.3 指针函数使用注意事项 ​三、RTC和BKP硬件结构 四、驱动代码解析 前言 STM32F103C8T6外部低速时钟LSE&#xff08;一般为32.768KHz&#xff09;用的引脚是PC14和PC…...

Python Selenium:Web自动化测试与爬虫开发

Python Selenium&#xff1a;Web自动化测试与爬虫开发 Python Selenium&#xff1a;Web自动化测试与爬虫开发安装Selenium设置WebDriver基础示例页面元素交互处理JavaScript和Cookies浏览器控制屏幕截图Headless Mode结束会话错误处理与调试 ***本文由AI辅助生成*** Python Se…...

Java-07 深入浅出 MyBatis - 一对多模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…...

用CAXA CAD电子图板导入图框、标题栏并导出pdf的方法

1.导入图框&#xff1a; 点击调入图框->出现读入图框文件 一个一个点击&#xff0c;选择合适的图框 然后点击导入 2.导入标题栏&#xff1a; 调入标题栏->出现读入标题栏文件 一个一个点击&#xff0c;选择合适的标题栏&#xff0c;然后点击导入 3.导出pdf&#x…...

深入了解 Linux htop 命令:功能、用法与示例

文章目录 深入了解 Linux htop 命令&#xff1a;功能、用法与示例什么是 htop&#xff1f;htop 的安装htop的基本功能A区&#xff1a;系统资源使用情况B区&#xff1a;系统概览信息C区&#xff1a;进程列表D区&#xff1a;功能键快捷方式 与 top 的对比常见用法与示例实际场景应…...

JDK1.8新增特性

新特性&#xff1a; Lambda表达式: &#xff08;语法三要素&#xff1a;参数、箭头、代码&#xff09; JDK1.8引入的一种新语法Lambda表达式,它简化了匿名内部类的使用和提高代码的可读性。 /**正常写法创建Runable**/ Runnable runnable new Runnable() {Overridepublic voi…...

环境背景文本到语音转换

目录 概述演示效果核心逻辑使用方式 概述 本文所涉及的所有资源的获取方式&#xff1a;https://www.aspiringcode.com/content?id100000000027&uid2f1061526e3a4548ab2e111ad079ea8c 论文标题&#xff1a; 本文提出了 VoiceLDM&#xff0c;这是一种旨在生成准确遵循两种…...

后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用

目录 后端数据增删改查Springboot 实体&#xff08;entity&#xff09;类引进添加UserMapper接口 创建对用的UserController注意数据库查询不一致新增数据更新删除postman测试 后端数据增删改查 基于之前构建系统&#xff0c;实现用户数据的CRUD。 打开navicat16&#xff0c;…...

《Python编程实训快速上手》第九天--调试技巧

一、抛异常 异常类型分为两类&#xff0c;第一类是Python自带的异常类型&#xff08;见《Python编程快速上手》第一天---前三章打基础&#xff09;&#xff0c;第二类是自定义异常。 面对自定义异常类型&#xff0c;使用raise抛异常&#xff0c;类型值默认为Exception&#x…...

html5复习一

目标 1、html5介绍及开发工具 2、html5标签 3、文本样式 4、图片标签和超链接标签 知识点&#xff1a; 万维网的构成&#xff1a; 1、url:统一资源定位器 2、http/https:超文本传输协议 3、html&#xff1a;超文本标记语言 html的后缀名&#xff1a; .html 和 .htm html基本…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...