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

MVC流程讲解——以文件下载为例

整体的流程是这样:

用户点击一个树节点 → 请求远程机器该目录下的文件信息 → 显示在树控件和列表控件中。

🧱 MCV 模式简介(针对这个场景)

模块代表什么主要职责
Model(模型)数据结构和逻辑表示你传输的数据结构、接收包内容、文件信息等
Control(控制器)逻辑处理层控制整个“请求 + 等待 + 接收 + 通知”的流程
View(视图)用户界面树控件、列表控件,处理 UI 展示和用户点击

分模块讲解整体流程

💡 1. 用户界面交互:LoadFileInfo()

View:视图侧只敢显示相关的工作

你在主界面 CRomoteClientDlg::LoadFileInfo() 中处理用户点击行为:

HTREEITEM hTreeSelected = m_Tree.HitTest(ptMouse, 0);  // 获取用户点击的树节点

如果节点合法,获取该路径并清空已有显示:

CString strPath = GetPath(hTreeSelected);  // 获取路径字符串
m_List.DeleteAllItems();                   // 清空文件列表
mDeleteTreeChildrenItem(hTreeSelected);   // 清空树控件中的子项

 👉 职责:

  • 获取用户点击操作

  • 准备显示控件(清空列表、树子项)

  • 调用控制器接口发出请求

CClientController::getInstance()->SendCommandPacket(...);

💡 发送命令请求:SendCommandPacket()

这一句是你主动发送命令请求文件目录信息:

int nCmd = CClientController::getInstance()->SendCommandPacket(2,                  // 命令编号(代表“请求文件信息”)FALSE,              // bAutoClose = FALSE(说明你想收多个包再处理)(BYTE*)(LPCTSTR)strPath,  // 数据内容(请求的路径)strPath.GetLength(),      // 数据长度&lstPackets);             // 存储返回包的容器

💡2. Control 控制层:负责流程调度和逻辑控制

💡 创建发送包 + 等待响应:SendPacket(...)

发送命令是Control端的逻辑,将其与业务端分离使得业务可以更具有可移植性

SendCommandPacket() 内部通过 SendPacket(...) 发出数据包,并阻塞等待返回

需要通过事件控制线程的访问这里会出现一定问题

int nCmd = 2;
SendPacket(nCmd, strData, strDataLen, hEvent);
WaitForSingleObject(hEvent, INFINITE);  // 🔥 等待后台线程处理完毕

👉 职责:

  • 根据用户命令号、路径拼接数据包

  • 调用 Model 层发包接口

  • 等待后台线程处理完毕(通过事件 hEvent)

  • 收到响应后将数据包返回给 UI

这是 MCV 中最重要的“连接者”,负责:

  • 管理数据发送/接收流程;

  • 将数据打包交给 Model 层去传输;

  • 同时协调 View 和 Model。

3. Model 模型层:负责网络传输 & 数据结构

典型类:

  • CClientSocket:负责 线程收发 和网络通信

  • CPacket:自定义的 数据结构

  • PFILEINFO:你传输的文件结构体

void CClientSocket::threadFunc() {// ⬇️ 从 m_lstSend 中取出要发送的数据包Send(head);// ⬇️ 接收服务端发来的多个响应数据包int nRecv = recv(...);CPacket pack((BYTE*)pBuffer, size);PFILEINFO pInfo = (PFILEINFO)(pack.strData.c_str());if (pInfo->HasNext == false) {SetEvent(head.hEvent);  // 唤醒主线程}
}

 💡 后台线程处理数据包:CClientSocket::threadFunc()

你的后台网络线程会循环处理发送队列 m_lstSend,把里面的包取出来发送到服务器,并等着 recv()

CPacket& head = m_lstSend.front();
Send(head);  // 发送包

然后你在 recv() 循环中不断接收数据:

int Length = recv(m_server, pBuffer, BUFFER_SIZE - index, 0);
// 接收到数据后构建成 CPacket 对象:
CPacket pack((BYTE*)pBuffer, size);
pack.hEvent = head.hEvent;

再通过它内部的 strData 拿出 PFILEINFO

PFILEINFO pInfo = (PFILEINFO)(pack.strData.c_str());

📌 模拟整体流转

步骤触发所在模块功能
1用户点击树节点ViewLoadFileInfo() 获取路径并准备界面
2调用 ControllerView → ControlSendCommandPacket() 发出请求
3数据打包并发送Control → Model创建 CPacket,调用 socket 发出
4阻塞等待响应ControlWaitForSingleObject(hEvent)
5线程接收数据ModelthreadFunc() 收包、判断结束、SetEvent()
6主线程被唤醒Control → View取回文件数据,更新 UI

相关文章:

MVC流程讲解——以文件下载为例

整体的流程是这样: 用户点击一个树节点 → 请求远程机器该目录下的文件信息 → 显示在树控件和列表控件中。 🧱 MCV 模式简介(针对这个场景) 模块代表什么主要职责Model(模型)数据结构和逻辑表示你传输的…...

深度学习之线性代数基础

2.3.7 点积 ∑按位积 2.3.8 矩阵-向量积 2.3.9 矩阵-矩阵乘法 2.3.10 范数...

某公司网络OSPF单区域配置

1.配置背景: xx公司网络由三台路由器和一台交换机组成,现在想要三台路由器之间通过OSPF实现互连互通。 2.网络结构如下: 3.具体配置: 3.1路由器 RA 配置: 1.更改主机名称: Router>en Router#conf t…...

vue+flask+GNN+neo4j图书知识图谱推荐系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 编号: F025 pro 架构: vueflaskneo4jmysqlpytorch 亮点:两种基于知识图谱的推荐算法(GNN和基于路径推荐&#x…...

小程序页面传值的多种方式

开发小程序,总是避免不了页面和页面之间数据共享,实现方法有很多种,以下就讲解一下小程序页面传值,需要的朋友可以参考下。 1 使用wx.navigateTo()传值 这种传值方式有两种, url后面拼接传值:需要跳转的…...

基于SSM框架的校园食堂小程序设计与实现

概述 基于SSM框架开发的微信小程序民大食堂用餐综合服务平台,该系统集成了商家管理、餐品展示、在线点。 主要内容 一、管理员模块功能实现 ​​用户信息管理​​ 管理员可添加、查看和删除用户信息,确保平台用户数据安全可靠。 ​​商家信息管理​​…...

FOC算法对MCU计算资源的需求?

评估FOC(磁场定向控制)算法对MCU计算资源的需求,需从算法复杂度、硬件特性、实时性要求等多维度分析。以下是具体步骤和关键要点: 一、拆解FOC算法的核心模块及计算复杂度 FOC算法主要由以下子模块组成,需分别评估各模块的计算量: 1. 传感器采样与预处理 ADC采样:电流…...

在 Excel 中使用通义灵码辅助开发 VBA 程序

VBA 简介 VBA 是一种用于微软办公套件(如 Word、Excel、PowerPoint 等)的编程语言,它本质上是一种内嵌的脚本,或者可以认为是一段命令,其标准叫法被称为宏。 VBA 只能依赖于对应的软件进行开发,例如本文就…...

嵌入式基础(三)基础外设

嵌入式基础(三)基础外设 1.什么是UART?与USART有什么区别⭐⭐⭐ (1)什么是UART 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。是一种异步全双工串行通信协议,它将要…...

【微服务管理】深入理解 Gateway 网关:原理与实现

在当今微服务架构盛行的时代,Gateway 网关扮演着举足轻重的角色。它作为微服务架构的重要组成部分,为系统提供了统一的入口,承担着诸如路由转发、负载均衡、安全防护、流量控制等关键功能。本文将深入探讨 Gateway 网关的底层原理&#xff0c…...

AI与无人驾驶汽车:如何通过机器学习提升自动驾驶系统的安全性?

引言 想象一下,在高速公路上,一辆无人驾驶汽车正平稳行驶。突然,前方的车辆紧急刹车,而旁边车道有一辆摩托车正快速接近。在这千钧一发的瞬间,自动驾驶系统迅速分析路况,判断最安全的避险方案,精…...

【网络安全】通过 JS 寻找接口实现权限突破

未经许可,不得转载。 本文所述所有风险点均已修复。 文章目录 引言正文引言 以下些漏洞已被起亚方面修复;起亚方面确认,这些漏洞从未被恶意利用过。 2024年6月11日,我们发现起亚汽车存在一系列严重安全漏洞,攻击者仅凭车牌号即可远程控制车辆的核心功能。该攻击不需要接触…...

【HarmonyOS NEXT】多目标产物构建实践

目录 什么是多产物构建 如何定义多个构建产物 如何在项目中使用 参考文章 什么是多产物构建 在鸿蒙应用开发中,一个应用可定义多个 product,每一个 product 对应一个定制的 APP 包,每个 product 中支持对 bundleName、bundleType、输出产…...

Openlayers:实现聚合

一、什么是聚合 聚合是一种将一定范围内的多个图形合并为一个图形的一种技术方案。通常用来解决图形过于集中或者图形数量过多的问题。 在Openlayers中主要通过Cluster数据源来实现聚合的效果。与其它的数据源不同,Cluster数据源在实例化时需要接收一个矢量数据源…...

相机内外参

文章目录 相机内参相机外参 相机的内外参是相机标定过程中确定的重要参数,用于建立图像像素坐标与实际世界坐标之间的关系。 相机内参 定义:相机内参是描述相机内部光学和几何特性的参数,主要包括焦距、主点坐标、像素尺度因子以及畸变系数等…...

轨道力学课程习题集

轨道力学课程习题集 第一讲:轨道力学概述 思考题 推导开普勒第三定律与牛顿万有引力定律的关系。 计算地球表面的第一宇宙速度和第二宇宙速度。 设计一个太阳同步轨道,高度为800公里,要求当地时间为上午10:30。 分析地球静止轨道的稳定性…...

【Web三十一】K8S的常用命令

01 基础资源操作​​ 查看资源​​ # 查看 kube-system 命名空间下的 Pod 列表 kubectl get pods -n kube-system# 查看节点详细信息(IP、状态等) kubectl get nodes -o wide# 按标签筛选 Pod(例如筛选标签 appnginx 的 Pod) ku…...

GDPR/CCPA

定义 GDPR(通用数据保护条例) 适用范围:适用于欧盟境内所有成员国,以及处理欧盟居民个人数据的全球企业。 数据主体权利:用户有权知道、访问、更正、删除(被遗忘权)自己的数据,还有…...

Lua中的元表

2025年4月14日,周一上午 Lua中的元表(metatable)是一种特殊的表,用于定义或修改其他表(或用户数据类型)的行为。通过元表中的元方法(meta-methods),开发者可以自定义表在…...

Sql Server(自用查看版)

目录 1、基本数据库相关概念 1.1数据Data 1.2数据库DataBase,DB 1.3数据库管理系统DataBase Management System,DBMS 1.4数据库系统 DataBase System DBS 1.5数据库系列架构 2、SQL sever 基本概念 单表查询 查询所有列的信息,用* 查询部分列&#xff1a…...

【JavaScript】二十、电梯导航栏的实现

文章目录 1、案例:电梯导航1.1 需求分析与实现1.2 关键思路梳理 2、属性选择器补充 1、案例:电梯导航 1.1 需求分析与实现 需求:点击不同的模块,页面可以自动跳转不同的位置 模块分析: 页面滚动到对应位置,导航显示…...

【Python】OpenCV图像处理

文章目录 OpenCV安装查看版本getVersionString查看图片像素shape打开图片imshowRGB灰度图图像裁剪image绘制处理噪点图像特征提取匹配图像梯度(canny边缘检测)阈值图像的形态学(腐蚀、膨胀)打开电脑的摄像头 OpenCV OpenCV&#…...

HTTP协议 --- 超文本传输协议 和 TCP --- 传输控制协议

是基于 TCP 协议的 80 端口的一种 C/S 架构协议。 特点:无状态 --- 数据传输完成后,会断开 TCP 连接,哪怕浏览器还正常运行。 请求报文 --- 方法 响应报文 --- 状态码 是一种面向连接的可靠传输协议 。 面向连接 --- 在传输数据之前&am…...

微信小程序实现table样式,自带合并行合并列

微信小程序在代码编写过程好像不支持原生table的使用&#xff0c;在开发过程中偶尔又得需要拿table来展示。 1.table效果展示 1.wxml <view class"table-container"><view class"table"><view class"table-row"><view cla…...

【NLP】25.python实现点积注意力,加性注意力,Decoder(解码器)与 Attention

1. 点积注意力&#xff08;Dot-Product Attention&#xff09; 点积注意力是最简单的注意力机制之一&#xff0c;其基本思想是通过计算查询&#xff08;query&#xff09;和键&#xff08;key&#xff09;之间的点积来得到相似度&#xff0c;进而为每个值&#xff08;value&am…...

基础贪心算法集合2(10题)

目录 1.单调递增的数字 2.坏了的计算器 3.合并区间 4.无重叠区间 5. 用最少数量的箭引爆气球 6.整数替换 解法1&#xff1a;模拟记忆化搜索 解法2位运算贪心 7.俄罗斯套娃信封问题 补充.堆箱子 8.可被3整除的最大和 9.距离相等的条形码 10.重构字符串 1.单调递增的数字…...

Oracle OCP知识点详解3:使用 vim 编辑文件

一、Vim 核心模式解析 1.1 模式切换图谱 graph LR A[普通模式] -->|i/I/a/A| B[插入模式] B -->|Esc| A A -->|v/V/Ctrlv| C[可视模式] A -->|: / ?| D[命令模式] C -->|Esc| A D -->|Enter| A 1.2 Oracle 场景高频模式组合 模式组合应用场景操作效率提…...

项目风险的早期识别与应对清单

项目风险的早期识别与应对策略的核心在于&#xff1a; 建立系统化的风险识别流程、评估风险的影响程度、制定详细的应对措施、持续监控与调整风险管理计划。 其中&#xff0c;建立系统化的风险识别流程是风险管理的第一步&#xff0c;也是最为关键的一环。通过构建一套有效的识…...

springboot数据动态脱敏

反射Jackson数据动态脱敏 我有两个字段&#xff0c;name和type&#xff0c;我想要在type为1对数据脱敏&#xff0c;而其他情况不脱敏&#xff1a; CustomSerializer注解 Target(ElementType.FIELD) //表示这个注解只能用在字段上 Retention(RetentionPolicy.RUNTIME) //注解…...

算法:定义一个数组的的陡峭值为:相邻两个元素之差的绝对值之和。

定义一个数组的的陡峭值为:相邻两个元素之差的绝对值之和。现在小红拿到了一个数组&#xff0c;她有多次询问&#xff0c;每次查询一段连续子数组的陡峭值。你能帮帮她吗? 连续子数组为从原数组中&#xff0c;连续的选择一段元素(可以全选、可以不选)得到的新数组。 输入描述 …...

【AI提示词】网络安全专家

提示说明 网络安全专家在数字时代扮演着至关重要的角色&#xff0c;他们通过专业的知识和技能保护网络系统免受攻击和破坏&#xff0c;确保数据的安全和隐私。 提示词 # 角色 网络安全专家## 性格类型指标 INTP&#xff08;内向直觉思维感知型&#xff09;## 背景 网络安全专…...

AI大模型原理可视化工具:深入浅出理解大语言模型的工作原理

AI大模型原理可视化工具&#xff1a;深入浅出理解大语言模型的工作原理 在人工智能快速发展的今天&#xff0c;大语言模型&#xff08;如GPT、BERT等&#xff09;已经成为改变世界的重要技术。但对于很多人来说&#xff0c;理解这些模型的工作原理仍然是一个挑战。为了帮助更多…...

解决无人机无人化自主巡检面对的新挑战-机载通信、控制及算力的AIBOX

解决无人机无人化自主巡检面对的新挑战-机载通信、控制及算力的AIBOX 之前的微文&#xff1a;基于无人机的无人化自主巡检-大疆机场3M4TD&#xff0c;介绍了机场3的无人机无人机巡检的特点以及局限性。此处从通信增强、飞行及位置服务增强、智慧飞行以及无人机编队几个方面阐述…...

供应商涨价,项目如何控制采购成本

优化供应商结构、严格控制交付流程、强化谈判策略、设置弹性预算、建立长远合作机制 来有效控制采购成本。其中&#xff0c;强化谈判策略 是最核心的一步&#xff1a;不仅要明确价格承受范围&#xff0c;还需根据对方供应链特点和市场行情&#xff0c;准备多套备选方案&#xf…...

newbee商城购物车模块mapper.xml

1.浏览代码 1&#xff09;表 自定义 DROP TABLE IF EXISTS tb_newbee_mall_shopping_cart_item; CREATE TABLE tb_newbee_mall_shopping_cart_item (cart_item_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 购物项主键id,user_id bigint(20) NOT NULL COMMENT 用户主键id…...

高级java每日一道面试题-2025年4月07日-微服务篇[Nacos篇]-如何监控Nacos的运行状态?

如果有遗漏,评论区告诉我进行补充 面试官: 如何监控Nacos的运行状态&#xff1f; 我回答: 监控Nacos运行状态的综合方案 在Java高级面试中&#xff0c;监控Nacos运行状态是一个重要的技术点&#xff0c;它直接关系到微服务架构的稳定性和性能。以下是一个综合的监控方案&am…...

开源技术如何助力中小企业实现财务管理自主化?

中小企业的数字化困境与开源机遇 国际数据公司&#xff08;IDC&#xff09;研究显示&#xff0c;全球67%的中小企业因高昂的软件成本和僵化的功能设计&#xff0c;未能有效推进数字化转型。传统商业软件常面临三大矛盾&#xff1a; 功能冗余与核心需求缺失&#xff1a;标准化系…...

3D-DIC技术:煤层开采瓦斯防治的精准监测解决方案

3D-DIC非接触式三维全场应变测量系统是基于数字图像相关算法&#xff08;DIC&#xff09;的一种光学测定应变、变形的方法。由CCD相机、光源、支架、数据采集器和DIC软件组成。 一、DIC技术瓦斯防治应用 新拓三维XTDIC三维全场应变测量系统&#xff0c;通过两个工业相机采集图…...

CS5346 - Annotation in Visualization (可视化中的注释)

文章目录 Annotation 的重要性Levels of Annotation &#xff08;注释的层级&#xff09;Headings and IntroductionHeadings&#xff08;标题&#xff09;陈述型&#xff08;Statement&#xff09;&#xff1a;突出结论或有趣发现疑问型&#xff08;Question&#xff09;&…...

VRoid-Blender-Unity个人工作流笔记

流程 VRoid 选配模型>减面、减材质>导出vrm Blender&#xff08;先有CATS、vrm插件&#xff09; 导入vrm>Fix model>修骨骼>导出fbx Unity 找回贴图、改着色器、调着色器参数…… VRoid 减面 以模型不出现明显棱角为准。脸好像减面100也问题不大。 下…...

【ROS2】行为树 BehaviorTree(三):异步操作

【ROS】郭老二博文之:ROS目录 1、简述 前面的例子中,使用过同步节点 SyncActionNode,当调用到该节点时,成功返回SUCCESS,失败返回FAILURE,并且线程会等待该节点执行完毕。 如果需要异步操作,比如节点执行需要很长时间,不能立刻返回结果,可以先去执行其它任务,等该…...

Uniapp:本地存储

目录 一、概述二、分类三、同步存储&#xff1a;setStorageSync3.1 方法3.2 案例3.2.1 存储3.2.2 获取3.2.3 获取storage3.2.4 删除3.2.5 清空 四、异步存储&#xff1a;setStorage4.1 方法4.2 案例4.2.1 存储数据4.2.2 获取数据4.2.3 获取storage详情4.2.4 删除4.2.5 清空 一、…...

3D版的VLA——从3D VLA、SpatialVLA到PointVLA(不动VLM,仅动作专家中加入3D数据)

前言 之前写这篇文章的时候&#xff0c;就想解读下3D VLA来着&#xff0c;但一直因为和团队并行开发具身项目&#xff0c;很多解读被各种延后 更是各种出差&#xff0c;比如从25年3月下旬至今&#xff0c;连续出差三轮&#xff0c;绕中国半圈&#xff0c;具身占八成 第一轮 …...

Linux/Unix 命令pstree

pstree 是一个用于以树状结构显示系统中进程关系的 Linux/Unix 命令。它可以直观地展示进程的父子关系&#xff0c;帮助用户理解进程之间的层次结构。 基本用法 pstree [选项] [PID或用户名]如果不带参数&#xff0c;pstree 会显示所有进程的树状结构。可以指定 PID 来查看某个…...

探索Linux/Unix 系统中进程与文件的深层关系

在 Linux 和 Unix 系统中&#xff0c;“一切皆文件” 的设计哲学贯穿始终。这种理念不仅简化了系统的操作接口&#xff0c;也赋予了用户和开发者极大的灵活性。文件、目录、设备、网络套接字&#xff0c;甚至进程本身&#xff0c;都可以通过文件系统的形式进行访问和操作。其中…...

AI:线性代数之矩阵

从0到1吃透线性代数矩阵:码农必修的数学武器库 ⚔️🔥 🧩 矩阵基础概念(程序员视角) 在人工智能时代,矩阵早已突破数学课本的边界,成为程序员手中的瑞士军刀🔪。TensorFlow底层用矩阵实现张量计算⚡,OpenCV依赖矩阵完成图像卷积🌌,Spark MLlib通过矩阵分解进行…...

object类

equals() 方法 equals() 方法的原始定义是比较两个对象的内存地址是否相同&#xff0c;但在实际使用中&#xff0c;很多类都会重写这个方法&#xff0c;使其用于比较对象的内容是否相同。例如 String 类就重写了 equals() 方法&#xff0c;用于比较字符串的内容。 String str…...

MySQL表的使用(4)

首先回顾一下之前所学的增删查改&#xff0c;这些覆盖了平时使用的80% 我们上节课中学习到了MySQL的约束 其中Primary key 是主键约束&#xff0c;我们今天要学习的是外键约束 插入一个表 外键约束 父表 子表 这条记录中classid为5时候&#xff0c;不能插入&#xff1b; 删除…...

国产海光 DCU 资源监控脚本 + Promethues+grafana 深度解析

在当今数字化时代,对于服务器资源的高效监控与管理愈发重要。特别是在使用国产海光 DCU 的场景下,如何精准掌握其资源使用情况,成为了众多技术人员关注的焦点。本文将详细介绍一款国产海光 DCU 资源监控脚本,以及它与 Prometheus 和 Grafana 的结合使用,助力大家实现对 DC…...

视觉slam框架从理论到实践-第一节绪论

从opencv的基础实现学习完毕后&#xff0c;接下来依照视觉slam框架从理论到实践&#xff08;第二版&#xff09;的路线进行学习&#xff0c;主要以学习笔记的形式进行要点记录。 目录 1.数据里程计 2.后端优化 3.回环检测 4.建图 在视觉SLAM 中整体作业流程可分为&#xff1…...