WPF框架---MvvmLight介绍
目录
1. MvvmLight 框架准备
2. MvvmLight 中的相关基类
3. MvvmLight 中的数据绑定与通知
a. 核心功能
b. 关键方法与属性
c. 完整示例
d. 高级用法
4. MvvmLight 中的命令对象
a. 命令对象的作用
b. 核心接口:ICommand
c. MvvmLight 中的 RelayCommand
d. 动态更新命令的可执行状态
e. 高级用法
5. Messenger 对象使用
a. Messenger 的核心作用
b. MvvmLight 中的 Messenger 实现
c. 基本使用场景
d. 高级用法
6. DispatcherHelper 对象使用
7. SimpleIoc 对象使用
a. SimpleIoc 的核心作用
b. 核心方法与属性
c. 基本使用步骤
d. 高级用法
e. 与 ViewModelLocator 结合使用
1. MvvmLight 框架准备
- 作用: 快速搭建 MVVM 架构的应用程序,简化数据绑定、命令和消息传递。
- 步骤: 通过 NuGet 安装
MvvmLightLibs
包。
2. MvvmLight 中的相关基类
- 核心基类:
-
ViewModelBase
: ViewModel 基类,实现INotifyPropertyChanged
。
public class MainViewModel : ViewModelBase
{private string _name;public string Name{get => _name;set => Set(ref _name, value); // 自动触发 PropertyChanged}
}
-
ObservableObject
: 轻量级可观察对象。RelayCommand
: 命令对象基类。
3. MvvmLight 中的数据绑定与通知
a. 核心功能
ViewModelBase
继承自 ObservableObject
,并实现了 INotifyPropertyChanged
接口,主要负责:
- 属性变更通知:当 ViewModel 的某个属性值发生变化时,自动通知 UI 更新。
- 简化代码:通过
Set
方法简化属性定义,避免手动触发PropertyChanged
事件。 - 设计模式支持:提供静态属性
IsInDesignMode
,用于区分代码是在设计时(如 Visual Studio 设计器)还是运行时执行。
b. 关键方法与属性
(1) Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
- 作用:在属性的
set
方法中调用此方法,自动比较新旧值,若不同则更新字段并触发PropertyChanged
事件。 - 示例:
private string _name;
public string Name
{get => _name;set => Set(ref _name, value); // 自动触发通知
}
(2)RaisePropertyChanged(string propertyName)
- 作用:手动触发某个属性的
PropertyChanged
事件。 - 场景:当某个属性的值依赖于其他属性时,手动通知 UI 更新。
public string FullName => $"{FirstName} {LastName}";private string _firstName;
public string FirstName
{get => _firstName;set{Set(ref _firstName, value);RaisePropertyChanged(nameof(FullName)); // 通知 FullName 属性变化}
}
(3) IsInDesignMode
- 作用:静态属性,判断当前代码是否在设计器(如 Visual Studio 或 Blend)中运行。
- 用途:在设计时提供假数据,避免调用真实服务或数据库。
public class MainViewModel : ViewModelBase
{public MainViewModel(){if (IsInDesignMode)Name = "Design Mode Sample"; // 设计器显示假数据elseLoadRealData(); // 运行时加载真实数据}
}
c. 完整示例
using GalaSoft.MvvmLight;public class UserViewModel : ViewModelBase
{private string _userName;private int _age;public string UserName{get => _userName;set => Set(ref _userName, value);}public int Age{get => _age;set => Set(ref _age, value);}// 计算属性(依赖其他属性)public string UserInfo => $"{UserName} (Age: {Age})";// 当 UserName 或 Age 变化时,手动通知 UserInfo 更新protected override void OnPropertyChanged(string propertyName = null){base.OnPropertyChanged(propertyName);if (propertyName == nameof(UserName) || propertyName == nameof(Age))RaisePropertyChanged(nameof(UserInfo));}
}
d. 高级用法
(1)批量通知多个属性
通过 RaisePropertyChanged(null)
或指定空字符串,通知所有属性更新(慎用,可能影响性能):
public void ResetAllProperties()
{_userName = "Default";_age = 0;RaisePropertyChanged(""); // 通知所有属性更新
}
(2) 继承与扩展
可继承 ViewModelBase
并添加通用逻辑(如日志记录、验证):
public abstract class CustomViewModelBase : ViewModelBase
{protected void LogPropertyChange(string propertyName){Debug.WriteLine($"属性 {propertyName} 已更新");}public override void RaisePropertyChanged(string propertyName = null){base.RaisePropertyChanged(propertyName);LogPropertyChange(propertyName);}
}
4. MvvmLight 中的命令对象
a. 命令对象的作用
- 解耦 UI 与业务逻辑:将用户操作(如点击按钮)映射到 ViewModel 的方法。
- 控制可执行状态:根据条件动态启用或禁用 UI 元素(例如按钮的
IsEnabled
)。 - 支持参数传递:允许从 UI 传递参数到 ViewModel(如选中项的 ID)。
b. 核心接口:ICommand
所有命令对象均实现 System.Windows.Input.ICommand
接口,其定义如下:
public interface ICommand
{event EventHandler CanExecuteChanged; // 通知命令可执行状态变化bool CanExecute(object parameter); // 判断命令是否可执行void Execute(object parameter); // 执行命令逻辑
}
c. MvvmLight 中的 RelayCommand
MvvmLight 提供 RelayCommand
和 RelayCommand<T>
类,简化了 ICommand
的实现。
(1) 基本用法(无参数)
public class MainViewModel : ViewModelBase
{public RelayCommand SaveCommand { get; }public MainViewModel(){// 初始化命令:绑定方法 + 可执行条件SaveCommand = new RelayCommand(SaveData, CanSave);}private void SaveData(){// 保存逻辑}private bool CanSave(){return !string.IsNullOrEmpty(Name); // 仅当 Name 非空时按钮可用}
}
(2) 支持参数传递(RelayCommand<T>)
public RelayCommand<string> FilterCommand { get; }public MainViewModel()
{FilterCommand = new RelayCommand<string>(param => ApplyFilter(param), param => !string.IsNullOrEmpty(param));
}private void ApplyFilter(string keyword)
{// 根据关键字过滤数据
}
d. 动态更新命令的可执行状态
(1) 手动触发更新
当 CanExecute
依赖的属性变化时,调用 RelayCommand
的 RaiseCanExecuteChanged
方法:
private string _name;
public string Name
{get => _name;set{Set(ref _name, value);SaveCommand.RaiseCanExecuteChanged(); // 触发重新检查 CanSave}
}
(1) 自动触发更新
利用 ViewModelBase
的 Set
方法自动触发属性变更通知,无需手动调用 RaiseCanExecuteChanged
:
private string _name;
public string Name
{get => _name;set => Set(ref _name, value); // Set 方法已自动触发 PropertyChanged
}// CanSave 方法中依赖 Name 属性
private bool CanSave() => !string.IsNullOrEmpty(Name);
e. 高级用法
(1) 异步命令
直接在命令中执行异步操作时,需注意线程安全(通过 DispatcherHelper
):
public RelayCommand LoadDataCommand { get; }public MainViewModel()
{LoadDataCommand = new RelayCommand(async () => await LoadDataAsync());
}private async Task LoadDataAsync()
{try{IsLoading = true;var data = await _dataService.GetData();// 更新 UI(确保在 UI 线程)DispatcherHelper.CheckBeginInvokeOnUI(() => DataList = data);}finally{IsLoading = false;}
}
(2) 复合命令
将多个命令组合成一个逻辑操作:
public RelayCommand SubmitAllCommand { get; }public MainViewModel()
{SubmitAllCommand = new RelayCommand(() =>{SaveCommand.Execute(null);LogCommand.Execute(null);}, () => SaveCommand.CanExecute(null) && LogCommand.CanExecute(null));
}
(3) 命令的泛型约束
public RelayCommand<int> DeleteItemCommand { get; }public MainViewModel()
{DeleteItemCommand = new RelayCommand<int>(id => DeleteItem(id), id => id > 0);
}private void DeleteItem(int itemId)
{// 删除指定 ID 的项
}
5. Messenger 对象使用
在 MVVM 模式 中,Messenger 是一个用于实现 松耦合通信 的核心组件,尤其在 MvvmLight 框架 中被广泛使用。它允许不同组件(如 ViewModel、View、服务)之间通过消息进行通信,而无需直接引用彼此,从而降低依赖、提升代码可维护性。
a. Messenger 的核心作用
- 解耦组件通信:组件无需持有对方引用,通过消息订阅/发布机制交互。
- 跨层级传递数据:例如从子 ViewModel 通知父 ViewModel,或跨页面传递状态。
- 支持复杂场景:如广播通知、请求-响应模式、事件聚合等。
b. MvvmLight 中的 Messenger 实现
MvvmLight 的 Messenger
类是一个静态单例(Messenger.Default
),提供消息的注册、发送和注销功能。其核心方法如下:
方法 | 作用 |
| 订阅类型为 的消息。 为接收者标识(通常为 )。 |
| 发送一条 类型的消息,所有订阅者会收到通知。 |
| 注销某个接收者的所有消息订阅,避免内存泄漏。 |
c. 基本使用场景
(1) 发送简单通知消息
- 场景:ViewModel A 完成数据加载后,通知 ViewModel B 刷新界面。
发送消息方:
// 发送一个无参数通知
Messenger.Default.Send(new NotificationMessage("DataLoaded"));
接收消息方(ViewModel B):
public ViewModelB()
{// 注册接收 NotificationMessage 类型的消息Messenger.Default.Register<NotificationMessage>(this, message =>{if (message.Notification == "DataLoaded"){RefreshData();}});
}
(2) 传递数据对象
- 场景:用户选择某条数据后,跨页面传递选中项。
定义消息类型:
public class ItemSelectedMessage
{public int ItemId { get; set; }public ItemSelectedMessage(int id) => ItemId = id;
}
发送方:
// 用户选择某项后发送消息
Messenger.Default.Send(new ItemSelectedMessage(selectedItem.Id));
接收方:
Messenger.Default.Register<ItemSelectedMessage>(this, message =>
{LoadItemDetails(message.ItemId); // 根据 ItemId 加载详情
});
d. 高级用法
(1) 消息令牌(Token)
- 作用:区分相同消息类型的不同用途,避免消息冲突。
发送带令牌的消息:
// 发送消息时指定令牌
Messenger.Default.Send(new NotificationMessage("UpdateChart"), "ChartToken" // 令牌标识
);
接收指定令牌的消息:
Messenger.Default.Register<NotificationMessage>(this, message => UpdateChartData(), "ChartToken" // 仅接收带有此令牌的消息
);
(2) 泛型消息
- 场景:传递强类型数据,避免类型转换。
定义泛型消息:
public class GenericMessage<T>
{public T Content { get; }public GenericMessage(T content) => Content = content;
}
发送泛型消息:
var data = new List<User>();
Messenger.Default.Send(new GenericMessage<List<User>>(data));
接收泛型消息:
Messenger.Default.Register<GenericMessage<List<User>>>(this, message =>
{UserList = message.Content; // 直接获取 List<User>
});
(3) 双向通信(请求-响应模式)
- 场景:ViewModel A 请求数据,ViewModel B 响应返回结果。
发送请求消息:
public class DataRequestMessage
{public Action<string> Callback { get; set; } // 定义回调委托
}// 发送请求,并注册回调
Messenger.Default.Send(new DataRequestMessage
{ Callback = response => HandleResponse(response)
});
接收请求并响应:
Messenger.Default.Register<DataRequestMessage>(this, message =>
{var data = FetchDataFromService(); // 获取数据message.Callback?.Invoke(data); // 执行回调
});
6. DispatcherHelper 对象使用
- 作用: 在非 UI 线程更新 UI。
- 初始化:
DispatcherHelper.Initialize(); // 在 App.xaml.cs 中调用
- 使用:
Task.Run(() =>{// 后台线程操作DispatcherHelper.CheckBeginInvokeOnUI(() =>{// 更新 UI 元素StatusText = "Processing...";});});
7. SimpleIoc 对象使用
SimpleIoc
是 MvvmLight 框架中提供的一个轻量级依赖注入(Dependency Injection, DI)容器,用于管理应用程序中各个组件(如 ViewModel、服务、数据源)的依赖关系。它通过 控制反转(IoC) 和 依赖注入 机制,帮助开发者实现代码解耦、提高可测试性和可维护性。
a. SimpleIoc 的核心作用
- 解耦组件依赖:将类的依赖关系从代码中抽离,通过容器统一管理。
- 单例生命周期管理:默认以单例模式提供实例,避免重复创建对象。
- 简化实例获取:通过接口或类型直接获取已注册的实例。
- 支持构造函数注入:自动解析构造函数参数,完成依赖注入。
b. 核心方法与属性
以下是 SimpleIoc
的常用方法及其功能:
方法/属性 | 作用 |
| 注册接口 和其实现类 。 |
| 直接注册类型 (无接口)。 |
| 获取类型 的实例(已注册的接口或类)。 |
| 检查类型 的实例是否已被创建。 |
| 重置容器,清空所有注册和实例(用于测试或重新初始化)。 |
| 检查类型 是否已注册。 |
c. 基本使用步骤
(1) 注册服务与 ViewModel
在应用程序启动时(如 ViewModelLocator
或 App.xaml.cs
中),注册所有依赖项:
public class ViewModelLocator
{public ViewModelLocator(){// 注册服务(接口 + 实现类)SimpleIoc.Default.Register<IDataService, DataService>();// 注册 ViewModel(无接口)SimpleIoc.Default.Register<MainViewModel>();}// 提供 ViewModel 实例的公共属性public MainViewModel Main => SimpleIoc.Default.GetInstance<MainViewModel>();
}
(2) 获取实例
通过 GetInstance<T>
方法获取已注册的实例:
// 获取 ViewModel 实例
var mainVM = SimpleIoc.Default.GetInstance<MainViewModel>();// 获取服务实例
var dataService = SimpleIoc.Default.GetInstance<IDataService>();
(3) 构造函数注入
当注册的类(如 ViewModel)依赖其他服务时,SimpleIoc
会自动解析构造函数参数:
public class MainViewModel : ViewModelBase
{private readonly IDataService _dataService;// 构造函数依赖注入:自动传入已注册的 IDataService 实例public MainViewModel(IDataService dataService){_dataService = dataService;}
}
d. 高级用法
(1) 单例模式 vs. 瞬时模式
单例模式(默认):整个应用程序生命周期内只创建一个实例。
// 默认单例模式
SimpleIoc.Default.Register<IDataService, DataService>();
瞬时模式:每次调用 GetInstance
时创建新实例。
SimpleIoc.Default.Register<IDataService, DataService>(createInstanceImmediately: false);
var service = SimpleIoc.Default.GetInstance<IDataService>(); // 每次返回新实例
(2) 手动指定实例
允许直接注册一个已存在的对象实例:
var logger = new FileLogger();
SimpleIoc.Default.Register<ILogger>(() => logger); // 注册现有实例
(3) 依赖覆盖
在测试中,可以替换实现类以注入 Mock 对象:
// 生产环境注册真实服务
SimpleIoc.Default.Register<IDataService, DataService>();// 测试环境覆盖为 Mock 服务
SimpleIoc.Default.Unregister<IDataService>();
SimpleIoc.Default.Register<IDataService, MockDataService>();
e. 与 ViewModelLocator 结合使用
ViewModelLocator
是 MvvmLight 中用于集中管理 ViewModel 的类,通常与 SimpleIoc
配合使用,通过 XAML 绑定 ViewModel。
(1) 定义 ViewModelLocator
public class ViewModelLocator
{public ViewModelLocator(){// 注册服务和 ViewModelSimpleIoc.Default.Register<IDataService, DataService>();SimpleIoc.Default.Register<MainViewModel>();}// 暴露 ViewModel 属性供 XAML 绑定public MainViewModel Main => SimpleIoc.Default.GetInstance<MainViewModel>();
}
(2) 在 XAML 中声明资源
在 App.xaml
中合并 ViewModelLocator
:
<Application.Resources><ResourceDictionary><vm:ViewModelLocator x:Key="Locator" /></ResourceDictionary>
</Application.Resources>
(3) 在 View 中绑定 ViewModel
<Window DataContext="{Binding Main, Source={StaticResource Locator}}"><!-- UI 元素绑定到 MainViewModel 的属性 -->
</Window>
相关文章:
WPF框架---MvvmLight介绍
目录 1. MvvmLight 框架准备 2. MvvmLight 中的相关基类 3. MvvmLight 中的数据绑定与通知 a. 核心功能 b. 关键方法与属性 c. 完整示例 d. 高级用法 4. MvvmLight 中的命令对象 a. 命令对象的作用 b. 核心接口:ICommand c. MvvmLight 中的 RelayCommand…...
C语言基础之【指针】(下)
C语言基础之【指针】(下) 指针和字符串字符指针字符指针做函数参数const修饰的指针变量指针数组做为main函数的形参项目开发常用字符串应用模型while和do-while模型两头堵模型字符串反转模型 字符串处理函数strchr()strrchr()strstr()strtok()strcpy()st…...
Deepseek中的MoE架构的改造:动态可变参数激活的MoE混合专家架构(DVPA-MoE)的考虑
大家好,我是微学AI,今天给大家介绍一下动态可变参数激活MoE架构(Dynamic Variable Parameter-Activated MoE, DVPA-MoE)的架构与实际应用,本架构支持从7B到32B的等多档参数动态激活。该架构通过细粒度难度评估和分层专家路由,实现“小问题用小参数,大问题用大参数”的精…...
【0012】Python函数详解
如果你觉得我的文章写的不错,请关注我哟,请点赞、评论,收藏此文章,谢谢! 本文内容体系结构如下: 编写代码往往是为了实现特定的功能,如果需要使用功能多次,也要写同样的代码多次吗…...
Stable Diffusion教程|快速入门SD绘画原理与安装
什么是Stable Diffusion,什么是炼丹师?根据市场研究机构预测,到2025年全球AI绘画市场规模将达到100亿美元,其中Stable Diffusion(简称SD)作为一种先进的图像生成技术之一,市场份额也在不断增长&…...
鸿蒙应用开发深度解析:API 14核心特性与实战指南
文章目录 一、HarmonyOS API 14架构升级解析1.1 系统架构演进1.2 核心能力对比 二、ArkUI 3.0开发实战2.1 声明式UI完整示例2.2 自定义组件开发 三、分布式能力深度开发3.1 跨设备数据同步流程3.2 分布式数据库操作 四、系统能力扩展开发4.1 后台任务管理4.2 硬件服务调用 五、…...
docker中kibana启动后,通过浏览器访问,出现server is not ready yet
问题:当我在浏览器访问kibana时,浏览器给我报了server is not ready yet. 在网上试了很多方法,都未能解决,下面是我的方法: 查看kibana日志: docker logs -f kibana从控制台打印的日志可以发现ÿ…...
2025年天梯赛第1场选拔赛
目录 A:徐老师的积木山峰 B:徐老师的最长上升子序列 C:徐老师的机器命令 D:徐老师的地下堡 E:徐老师的新鲜羊腿 F:徐老师的黄金矿工 G:徐老师的成绩统计 H:春节糖果 I:幸运函数 J:好坏钥匙 A:徐老师的积木山峰 徐老师有 n 块积木排成一排,从左往右数编号依次为 1∼…...
28-文本左右对齐
给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可…...
SpringBoot校园管理系统设计与实现
在现代校园管理中,一个高效、灵活的管理系统是不可或缺的。本文将详细介绍基于SpringBoot的校园管理系统的设计与实现,涵盖管理员、用户和院校管理员三大功能模块,以及系统的部署步骤和数据库配置。 管理员功能模块 管理员是系统的核心管理…...
thunder bird 配置邮箱
1.配 outlook https://cn.windows-office.net/?p22940 2.配 qq 邮箱 https://blog.csdn.net/lx_ros/article/details/124831850 3.QQ邮箱的授权码在 账号与安全 4.qq 邮箱 更换 foxmail 邮箱名 https://www.yigujin.cn/blog/p10094.html 结语 感觉网上搜到的都不咋好&…...
机器学习中的线性代数:奇异值分解 SVD
线性代数 奇异值分解(SVD) 参考资料: 超详细!彻底搞懂矩阵奇异值分解(SVD)本质计算应用!_哔哩哔哩_bilibili 非常好的视频,本文内容主要来自于该视频,在此表示感谢&#…...
机器学习深度学习基本概念:logistic regression和softmax
逻辑回归用来处理二分类问题 softmax用来处理多分类问题:比如llm在generate的时候,每个batch里面的一个样本的一个一次generate就是softmax生成一个大小为vocab_size的向量的概率分布,然后再采样 逻辑回归(logistic regression&…...
机器学习(六)
一,决策树: 简介: 决策树是一种通过构建类似树状的结构(颠倒的树),从根节点开始逐步对数据进行划分,最终在叶子节点做出预测结果的模型。 结构组成: 根节点:初始的数据集…...
在 Maven 中使用 <scope> 元素:全面指南
目录 前言 在 Maven 中, 元素用于定义依赖项的作用范围,即依赖项在项目生命周期中的使用方式。正确使用 可以帮助我们优化项目的构建过程,减少不必要的依赖冲突,并提高构建效率。本文将详细介绍 的使用步骤、常见作用范围、代码…...
Manus邀请码如何申请,有哪些办法
Manus是由Monica团队推出的一款通用型AI智能体产品,旨在通过自主任务规划与执行能力,将用户的想法转化为实际成果。它不仅能够理解复杂指令,还能通过调用虚拟环境中的工具(如浏览器、代码编辑器、文件处理器等)&#x…...
大型WLAN组网部署(Large scale WLAN network deployment)
大型WLAN组网部署 大型WLAN网络关键技术 技术 作用 VLAN Pool 通过VLAN Pool把接入的用户分配到不同的VLAN,可以减少广播域,减少网络中的广播报文,提升网络性能。 DHCP Option 43 & 52 当AC和AP间是三层组网时,AP通过…...
MQ保证消息的顺序性
在消息队列(MQ)中保证消息的顺序性是一个常见的需求,尤其是在需要严格按顺序处理业务逻辑的场景(例如:订单创建 → 支付 → 发货)。 一、消息顺序性被破坏的原因 生产者异步/并行发送:消息可能…...
SQL Server查询计划操作符(7.3)——查询计划相关操作符(9)
7.3. 查询计划相关操作符 78)Repartition Streams:该操作符消费多个输入流并产生多个输出流。期间,记录内容与格式保持不变。如果查询优化器使用一个位图过滤(bitmap filter),则输出流中的数据行数将会减少。一个输入流的每行记录被放入一个输出流。如果该操作符保留顺序…...
杨校老师课堂之零基础入门C++备战信息学奥赛-基础篇
零基础快速入门C C学习路线一、基础语法1. C基础框架2. C语言输出3. C 语言输入4. C 数据类型5. C 赋值6. 运算符与表达式7. 控制结构语句7.1 if分支结构语句7.1.1 单分支结构语句7.1.2 双分支结构语句7.1.3 多分支结构语句 7.2 switch开关语句 8. 循环结构语句8.1 for循环8.2 …...
wxWidgets GUI 跨平台 入门学习笔记
准备 参考 https://wiki.wxwidgets.org/Microsoft_Visual_C_NuGethttps://wiki.wxwidgets.org/Tools#Rapid_Application_Development_.2F_GUI_Buildershttps://docs.wxwidgets.org/3.2/https://docs.wxwidgets.org/latest/overview_helloworld.htmlhttps://wizardforcel.gitb…...
Aws batch task 无法拉取ECR 镜像unable to pull secrets or registry auth 问题排查
AWS batch task使用了自定义镜像,在提作业后出现错误 具体错误是ResourceInitializationError: unable to pull secrets or registry auth: The task cannot pull registry auth from Amazon ECR: There is a connection issue between the task and Amazon ECR. C…...
亚信安全发布2024威胁年报和2025威胁预测
在当今数字化时代,网络空间已成为全球经济、社会和国家安全的核心基础设施。随着信息技术的飞速发展,网络连接了全球数十亿用户,推动了数字经济的蓬勃发展,同时也带来了前所未有的安全挑战。2024年,网络安全形势愈发复…...
verb words
纠正correct remedy 修正modify 协商 confer 磋商/谈判 negotiate 通知notice notify *宣布announce 声明declare 宣告 declare *颁布 promulgate /introduce 协调coordinate 评估evaluate assess 撤离evacuate *规定stipulate 参与participate, 涉及refer…...
程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<12>
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 目录 一、回调函数二、qsort2.1 使用qsort函数排序整型数据2.2 使用qsort排序结构数据2.3 qsort函数的模…...
视频录像机视频通道是指什么
视频录像机的视频通道是指摄像机在监控矩阵或硬盘录像机设备上的视频输入的物理位置。 与摄像头数量关系:在视频监控系统中,有多少个摄像头就需要多少路视频通道,通道数量决定了视频录像机可接入摄像头的数量,一般硬盘录像机有4路…...
MySQL 实战 4 种将数据同步到ES方案
文章目录 1. 前言2. 数据同步方案 2.1 同步双写2.2 异步双写2.3 定时更新2.4 基于 Binlog 实时同步 3. 数据迁移工具选型 3.1 Canal3.2 阿里云 DTS3.3 Databus3.4 Databus和Canal对比3.4 其它 4. 后记 上周听到公司新同事分享 MySQL 同步数据到 ES 的方案,发现很有…...
sqlserver中的锁模式 | SQL SERVER如何开启MVCC(使用row-versioning)【启用行版本控制减少锁争用】
文章目录 引言锁和隔离级别的关系锁模式之间兼容性I 隔离级别SQLServer默认的隔离级别为:“read commited” (已提交读)在SQLServer2005引入了基于行版本控制的隔离级别。SQL SERVER如何开启MVCC(使用row-versioning)sqlserver开启MVCC后的锁II sqlserver中的锁模式**1、共享…...
拥抱健康养生,开启活力生活
在快节奏的现代生活中,健康养生已成为人们关注的焦点,它不仅是对身体的呵护,更是一种积极的生活态度。 合理饮食是健康养生的基石。我们应秉持均衡膳食的理念,谷物、蔬菜、水果、蛋白质类食物一个都不能少。每天保证足够的蔬菜摄入…...
江科大51单片机笔记【9】DS1302时钟可调时钟(下)
在写代码前,记得把上一节的跳线帽给插回去,不然LCD无法显示 一.DS1302时钟 1.编写DS1302.c文件 (1)重新对端口定义名字 sbit DS1302_SCLKP3^6; sbit DS1302_IOP3^4; sbit DS1302_CEP3^5;(2)初始化 因为…...
Python可视化——地理空间型图表(自用)
地图信息可视化的实现就是将不可展开的曲面上的地理坐标信息转化为二维平面进行显示,这个过程也叫地图投影(空间三维投影到平面二维) 地图投影的要求:等面积、等角度、等距离。总的来说就是映射到二维平面中的任何点通过比例尺放大…...
Python 网络爬虫教程与案例详解
Python 网络爬虫教程与案例详解 在当今数字化时代,数据的价值愈发凸显。Python 作为一门强大的编程语言,在数据获取领域有着广泛的应用,其中网络爬虫便是一项重要的技术。网络爬虫能够自动从网页中提取所需数据,极大地提高了数据…...
最新的前端场景面试题
1、如何实现一个Vue3的弹框组件,你会如何设计? 如果要实现一个 Vue3 的弹框组件,我会从以下几个关键点进行设计: 组件结构:定义组件的基础结构,包括模块(template)、脚本(script)和样式(style);显示和隐藏逻辑:设计和实现弹框的显示和隐藏机制,通常通过传递 pro…...
冲刺高分!挑战7天一篇孟德尔联合meta分析 DAY1-7
Day1 此前我们完成了若干篇关于meta的挑战,这一次挑战想在meta分析基础上进一步创新一些,这一次想要挑战孟德尔联合meta分析的文章,有想学习的师弟师妹跟我们一起完成这波挑战吧~ Day1任务收集信息明确选题明确目标期刊精读范文…...
win32汇编环境,对话框中使用树形视图示例二
;运行效果 ;win32汇编环境,对话框中使用树形视图示例二 ;得到树形视图控件Treeview的全路径字符串,这里的方法是由子项向父项挨个找的算法找齐路径 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>&g…...
前端开发10大框架深度解析
摘要 在现代前端开发中,框架的选择对项目的成功至关重要。本文旨在为开发者提供一份全面的前端框架指南,涵盖 React、Vue.js、Angular、Svelte、Ember.js、Preact、Backbone.js、Next.js、Nuxt.js 和 Gatsby。我们将从 简介、优缺点、适用场景 以及 实际…...
tomcat的web管理
进入到conf cd /usr/local/tomcat/conf/备份tomcat-users.xml cp tomcat-users.xml{.,bak}编辑tomcat-users.xml vim tomcat-users.xml增加以下内容 配置tomcat-users.xml <role rolename"manager-gui"/><role rolename"admin-gui"/><use…...
类和对象(上)
1.面向过程与面向对象的初步认识 面向过程:以步骤为中心,适合简单逻辑,但复杂系统易混乱。 面向对象:以对象职责为中心,通过抽象和模块化应对复杂需求。 C语言:面向过程,关注的是过程࿰…...
springcloud智慧工地物联网云管理系统源码
智慧工地以物联网云平台为核心,基于智慧工地物联网云平台与现场多个子系统的互联,实现现场各类工况数据采集,存储、分析与应用。通过接入智慧工地物联网云平台的多个子系统板块,根据现场管理实际需求灵活组合,实现一体…...
SLAM评估工具安装及使用EVO(Ubuntu20.04安装evo)--缺少 onnx 库还有Pandas 版本不兼容解决
介绍一下我的是ubuntu20.04.机载电脑是orinnx,通过源码烧写的系统。 首先打开终端,输入 pip install evo --upgrade --no-binary evo 安装过程中出现如下问题 缺少 onnx 库还有Pandas 版本不兼容, ONNX(Open Neural Network E…...
K8S学习之基础十五:k8s中Deployment扩容缩容
deployment扩容缩容比较简单,下面介绍两种常用方法 vi deploy-demo.yaml kind: Deployment metadata:name: myapp-v1 spec:replicas: 2selector:matchLabels:app: myappversion: v1template:metadata:labels:app: myappversion: v1spec:containers:- name: myappim…...
ClickHouse 中出现 DB::Exception: Too many parts 错误
在 ClickHouse 中出现 DB::Exception: Too many parts 错误,通常是由于表中数据分片(parts)数量超过系统限制,导致合并(merge)操作无法及时处理。以下是逐步解决方案: 1. 理解问题原因 MergeTr…...
PPT 小黑第20套
对应大猫21 Word转PPT 图片也得复制 题目要求两套PPT母板,应用不同版式(版式那就可以选) 竖排文字...
大模型管理工具:LLaMA-Factory
目录 一、安装与环境配置 二、启动 Web 界面 三、数据准备 四、模型训练 五、模型评估 七、模型导出 八、API服务部署 LLaMA-Factory 是一个开源的大语言模型(LLM)微调框架,旨在简化大规模模型的训练、微调和部署流程。它支持多种主…...
【机器人栅格地图】基于鹭鹰算法SBOA实现机器人栅格地图路径规划(目标函数:最短距离)附Matlab代码
基于鹭鹰算法(SBOA)的机器人栅格地图路径规划实现 一、鹭鹰算法(SBOA)的基本原理 鹭鹰优化算法(Secretary Bird Optimization Algorithm, SBOA)是一种新型元启发式算法,灵感源自鹭鹰的捕猎和逃…...
【Linux篇】版本控制器-Git
📌 个人主页: 孙同学_ 🔧 文章专栏:Liunx 💡 关注我,分享经验,助你少走弯路! 文章目录 1.如何理解版本控制?2.Git的操作补充细节问题 1.如何理解版本控制? 版…...
论文阅读:KAM-CoT: Knowledge Augmented Multimodal Chain-of-Thoughts Reasoning
论文来源:AAAI 2024 论文地址:https://ojs.aaai.org/index.php/AAAI/article/view/29844 Abstract LLM通过利用能够逐步思考的思维链在NLP任务中取得了很好的性能,但是为LLM扩展多模态能力时计算成本高,且需要大量的硬件资源。…...
linux内存页块划分及位图存储机制
page_alloc.c - mm/page_alloc.c - Linux source code v5.4.285 - Bootlin Elixir Cross Referencer 一. 什么是页块(Pageblock)? 定义:页块是物理内存中的一个连续区域,由 2^pageblock_order 个物理页(Pag…...
一台云工作站是否能通过共享云桌面让10人流畅进行三维设计
云工作站,作为一种基于云计算技术的远程工作站解决方案,它将高性能的计算资源集中在云端服务器上,用户通过网络访问这些资源,实现高效、灵活的办公和创作环境。而三维设计,尤其是涉及复杂模型、高精度渲染等领域&#…...
安卓应用之服务
服务 服务也是四大组件之一,用于执行长时间运行操作的组件,它与用户界面(UI)是分开的,因此即使用户切换到其他应用,服务依然可以继续运行。主要用于处理一些不需要用户交互的任务。例如,播放音…...