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

windows C++-C++/WinRT 中创建组件和事件(下)

跨 ABI 的简单信号

如果无需连同事件传递任何形参或实参,则可以定义自己的简单 Windows 运行时委托类型。 以下示例展示 Thermometer 运行时类的更简易版本。 它声明名为 SignalDelegate 的委托类型,然后使用该类型来引发信号类型事件,而不是具有参数的事件。

// ThermometerWRC.idl
namespace ThermometerWRC
{delegate void SignalDelegate();runtimeclass Thermometer{Thermometer();event ThermometerWRC.SignalDelegate SignalTemperatureIsBelowFreezing;void AdjustTemperature(Single value);};
}// Thermometer.h
...
namespace winrt::ThermometerWRC::implementation
{struct Thermometer : ThermometerT<Thermometer>{...winrt::event_token SignalTemperatureIsBelowFreezing(ThermometerWRC::SignalDelegate const& handler);void SignalTemperatureIsBelowFreezing(winrt::event_token const& token);void AdjustTemperature(float deltaFahrenheit);private:winrt::event<ThermometerWRC::SignalDelegate> m_signal;float m_temperatureFahrenheit{ 0.f };};
}// Thermometer.cpp
...
namespace winrt::ThermometerWRC::implementation
{winrt::event_token Thermometer::SignalTemperatureIsBelowFreezing(ThermometerWRC::SignalDelegate const& handler){return m_signal.add(handler);}void Thermometer::SignalTemperatureIsBelowFreezing(winrt::event_token const& token){m_signal.remove(token);}void Thermometer::AdjustTemperature(float deltaFahrenheit){m_temperatureFahrenheit += deltaFahrenheit;if (m_temperatureFahrenheit < 32.f){m_signal();}}
}// App.cpp
struct App : implements<App, IFrameworkViewSource, IFrameworkView>
{ThermometerWRC::Thermometer m_thermometer;winrt::event_token m_eventToken;...void Initialize(CoreApplicationView const &){m_eventToken = m_thermometer.SignalTemperatureIsBelowFreezing([] { /* ... */ });}...void Uninitialize(){m_thermometer.SignalTemperatureIsBelowFreezing(m_eventToken);}...void OnPointerPressed(IInspectable const &, PointerEventArgs const & args){m_thermometer.AdjustTemperature(-1.f);...}...
};
项目中的参数化委托、简单信号和回调

如果所需事件是 Visual Studio 项目内部的(未跨二进制文件),而在内部这些事件不限于 Windows 运行时类型,则仍可使用 winrt::event<Delegate> 类模板。 请直接使用 winrt::delegate 而不是实际的 Windows 运行时委托类型,因为 winrt::delegate 也支持非 Windows 运行时参数。

以下示例先显示不采用任何参数的委托签名(本质上即简单信号),然后显示采用字符串的委托签名。

如果所需事件是 Visual Studio 项目内部的(未跨二进制文件),而在内部这些事件不限于 Windows 运行时类型,则仍可使用 winrt::event<Delegate> 类模板。 请直接使用 winrt::delegate 而不是实际的 Windows 运行时委托类型,因为 winrt::delegate 也支持非 Windows 运行时参数。

以下示例先显示不采用任何参数的委托签名(本质上即简单信号),然后显示采用字符串的委托签名。

winrt::event<winrt::delegate<>> signal;
signal.add([] { std::wcout << L"Hello, "; });
signal.add([] { std::wcout << L"World!" << std::endl; });
signal();winrt::event<winrt::delegate<std::wstring>> log;
log.add([](std::wstring const& message) { std::wcout << message.c_str() << std::endl; });
log.add([](std::wstring const& message) { Persist(message); });
log(L"Hello, World!");

注意如何向事件添加尽可能多的订阅委托。 但会产生一些与事件相关的开销。 如果只需仅具有一个订阅委托的简单回调,则你可以独立使用 winrt::delegate<…T>。

winrt::delegate<> signalCallback;
signalCallback = [] { std::wcout << L"Hello, World!" << std::endl; };
signalCallback();winrt::delegate<std::wstring> logCallback;
logCallback = [](std::wstring const& message) { std::wcout << message.c_str() << std::endl; }f;
logCallback(L"Hello, World!");
 可延迟事件

Windows 运行时中的常见模式是可延迟事件。 事件处理程序通过调用事件参数的 GetDeferral 方法采用延迟。 这样做会向事件源指示应推迟事件后活动,直到延迟完成。 这允许事件处理程序执行异步操作以响应事件。

winrt::deferrable_event_args 结构模板是一个帮助程序类,用于实现(生成)Windows 运行时延迟模式。 下面是一个示例。

// Widget.idl
namespace Sample
{runtimeclass WidgetStartingEventArgs{Windows.Foundation.Deferral GetDeferral();Boolean Cancel;};runtimeclass Widget{event Windows.Foundation.TypedEventHandler<Widget, WidgetStartingEventArgs> Starting;};
}// Widget.h
namespace winrt::Sample::implementation
{struct Widget : WidgetT<Widget>{Widget() = default;event_token Starting(Windows::Foundation::TypedEventHandler<Sample::Widget, Sample::WidgetStartingEventArgs> const& handler){return m_starting.add(handler);}void Starting(event_token const& token) noexcept{m_starting.remove(token);}private:event<Windows::Foundation::TypedEventHandler<Sample::Widget, Sample::WidgetStartingEventArgs>> m_starting;};struct WidgetStartingEventArgs : WidgetStartingEventArgsT<WidgetStartingEventArgs>,deferrable_event_args<WidgetStartingEventArgs>//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^{bool Cancel() const noexcept { return m_cancel; }void Cancel(bool value) noexcept { m_cancel = value; }bool m_cancel = false;};
}

下面是事件接收方使用可延迟事件模式的方式。

// EventRecipient.h
widget.Starting([](auto sender, auto args) -> fire_and_forget
{auto deferral = args.GetDeferral();if (!co_await CanWidgetStartAsync(sender)){// Do not allow the widget to start.args.Cancel(true);}deferral.Complete();
});

 作为事件源的实现者(生成者),从 winrt::deferrable_event_args 派生事件 args 类。 deferrable_event_args<T> 为你实现 T::GetDeferral。 它还公开新的帮助程序方法 deferrable_event_args::wait_for_deferrals,该方法在所有未完成的延迟完成后完成(如果没有延迟要执行,则会立即完成)。

// Widget.h
IAsyncOperation<bool> TryStartWidget(Widget const& widget)
{auto args = make_self<WidgetStartingEventArgs>();// Raise the event to let people know that the widget is starting// and give them a chance to prevent it.m_starting(widget, *args);// Wait for deferrals to complete.co_await args->wait_for_deferrals();// Use the results.bool started = false;if (!args->Cancel()){widget.InsertBattery();widget.FlipPowerSwitch();started = true;}co_return started;
}

相关文章:

windows C++-C++/WinRT 中创建组件和事件(下)

跨 ABI 的简单信号 如果无需连同事件传递任何形参或实参&#xff0c;则可以定义自己的简单 Windows 运行时委托类型。 以下示例展示 Thermometer 运行时类的更简易版本。 它声明名为 SignalDelegate 的委托类型&#xff0c;然后使用该类型来引发信号类型事件&#xff0c;而不是…...

C++初学者指南-5.标准库(第二部分)--二叉堆操作

C初学者指南-5.标准库(第二部分)–二叉堆操作 文章目录 C初学者指南-5.标准库(第二部分)--二叉堆操作背景什么是“堆”二叉最大堆二叉树的表示 堆操作C标准库中的堆初始化堆收缩堆增长堆 辅助操作sort_heap (Heap → Sorted Array)is_heapis_heap_until 相关内容 不熟悉 C 的标…...

在Ubuntu 16.04上安装Git的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 在现代软件开发中&#xff0c;一个不可或缺的工具是某种版本控制系统。版本控制系统允许您在源代码级别跟踪软件。您可以跟踪更改…...

redis内存淘汰策略-------Reservoir Sampling(水库采样)

文章目录 过期删除策略和内存淘汰策略内存淘汰策略evictionPoolEntryevictionPoolPopulate Reservoir SamplingdictGetRandomKeydictGetSomeKeysReservoir Samplingchatgpt对Reservoir Sampling的介绍 过期删除策略和内存淘汰策略 详细介绍请参考博客“redis过期删除策略和内存…...

C++《类和对象》(上)

在之前的C入门基础知识中我们了解了C的发展过程已经重要性&#xff0c;还初步了解了C中一些相比C语言特有的知识点&#xff0c;例如命名空间、缺少参数、函数重载、引用等&#xff0c;接下来在本篇中我们将开始C整个体系中非常重要的一个知识章节——类和对象&#xff0c;类和对…...

LLM大语言模型算法特训

百度 LLM&#xff08;Large Language Model&#xff09;大语言模型算法特训是一个深度学习领域的高级培训项目&#xff0c;专门设计用于训练和优化大规模语言模型的开发者和研究人员。本文将详细探讨LLM算法的基本原理、训练技术、应用领域以及参与者可以预期的学习收获和挑战。…...

Docker相关笔记

Docker笔记 1. Dockerfile编译构建docker Dockerfile 是一个文本文件&#xff0c;包含了构建 Docker 镜像的所有指令。 Dockerfile 常用的有如下关键字&#xff1a; FROM&#xff1a;指定基础镜像&#xff0c;后续定制操作都是基于这个基础镜像&#xff0c;比如&#xff1a; …...

前端技术day01-HTML入门

一、前端介绍 技术描述HTML用于构建网站的基础结构的CSS用于美化页面的&#xff0c;作用和化妆或者整容作用一样JS实现网页和用户的交互Vue主要用于将数据填充到html页面上的Element主要提供了一些非常美观的组件 二、工具软件 VsCode 在前端领域&#xff0c;有一个公认好用…...

Multisim 用LM358 运放模拟线性稳压器 - 运放输出饱和 - 前馈电容

就是拿运放搭一个可调的LDO 稳压器&#xff0c;类似下面这个功能框图里的感觉。本来应该非常简单&#xff0c;没什么好说的&#xff0c;没想到遇到了两个问题。 原理 - 理想运放 我用PNP 三极管Q2 作为输出&#xff0c;运放输出电压升高时&#xff0c;流过PNP 三极管BE 的电流变…...

宁德大屏第二版总结

碰到难点 1.wss 心跳机制 实现前端和后端双向绑定 只要后端发送了消息 前端通过全局总线去触发你想要的函数。 全局总线 vue3可以全局总线下一个mitt 新建一个eventBus.js import mitt from "mitt"; const eventBus mitt();export default eventBus; 然后wss…...

冥想第一千二百四十七天(1247)

1.今天上午带桐桐去游泳了&#xff0c;买了卡吉诺&#xff0c;吃过最好吃的甜点。推荐。还有鸡排。 2.回来后带着媳妇&#xff0c;先加油。去给丈母娘看腿&#xff0c;等丈母娘等了好久&#xff0c;还帮她推车。 3.回来后&#xff0c;在丈母娘家跑步。很舒服。家长麦田的香味。…...

基于光学动捕定位下的Unity-VR手柄交互

Unity VR 场景手柄交互实现方案 需求 在已创建好的 Unity VR 场景中&#xff0c;接入游戏手柄&#xff0c;通过结合动捕系统与 VRPN&#xff0c;建立刚体&#xff0c;实时系统获取到手柄的定位数据与按键数据&#xff0c;通过编写代码实现手柄的交互逻辑&#xff0c;实现手柄…...

php json_decode 带反斜杠字符串json解析

PHP json_decode 带反斜杠字符串json解析 今天再次遇到了json字符串中包含反斜杠的问题&#xff0c;记录下解决方法 在JSON字符串中&#xff0c;反斜杠\用作转义字符。当JSON_UNESCAPED_SLASHES选项被用于json_encode()函数时&#xff0c;不会在slashes前面添加反斜杠。 但是…...

【NLP】文本张量表示方法【word2vec、词嵌入】

文章目录 1、文本张量表示2、one-hot词向量表示2.1、one-hot编码代码实现&#xff1a;2.2、onehot编码器的使用2.3、one-hot编码的优劣势 3、word2vec模型3.1、模型介绍3.2、CBOW模式3.3、skipgram模式3.4、word2vec的训练和使用3.4.1、获取训练数据3.4.2、训练词向量3.4.3、查…...

疯狂Java讲义_08_泛型

文章目录 泛型的传参若函数里的参数使用基类接受所有的派生类&#xff0c;怎么做&#xff1f; 类型通配符的上限类型通配符的下限 泛型的传参 注意 若类 Base 是类 Derived 的基类&#xff08;父类&#xff09;&#xff0c;那么数组类型 Base[] 是 Derived[] 的基类&#xff0…...

HCIA、OSPF笔记

一、OSI参考模型 1、OSI的结构 应用层&#xff1a;把人类语言转化成编码&#xff0c;为各种应用程序提供网络服务。 表示层&#xff1a;定义一些数据的格式&#xff0c;&#xff08;对数据进行加密、解密、编码、解码、压缩、解压缩&#xff0c;每一层都可以实现&#xff0c…...

Python删除lru_cache缓存

在 Python 中,lru_cache 是一个装饰器,用于添加缓存功能以提高函数的性能。如果你想清除或者删除 lru_cache 中的缓存,有几种方法可以做到: 手动清除缓存: lru_cache 对象有一个方法叫做 cache_clear(),可以手动清除所有缓存。示例:@lru_cache(maxsize=128) def some_fun…...

Android面试必问题:大白文讲透Android View工作原理

目录 第一章 引言 第二章 Android View 基础概念 2.1 视图(View) 2.2 布局(Layout) 2.3 绘制(Drawing) 第三章 Android View 工作原理详解 3.1 测量过程剖析 3.2 布局流程探究 第四章 Android View 性能优化建议 4.1 视图层级优化 4.2 避免过度的视觉效果 4.…...

WinDbg配置远程调试

WinDbg配置远程调试 1、为什么需要远程调试 某些特殊的场合需要远程调试&#xff0c;如&#xff1a; ①调试特殊的程序&#xff0c;比如在调试全屏程序&#xff0c;内核。 ②需要别人帮助调试或者帮助别人调试。比如由于商业性质不能直接给你pdb和源代码。 ③还有一类就是…...

spl注入实战thinkphp

目录 一、环境的部署 二、本地创建数据库 三、填写数据库连接文件 四、编写控制器 五、访问分析 debug报错会显示物理路径 原因是config.php文件相关配置 六、注入分析 七、进入断点调试 八、通过mysql执行语句查看结果 九、总结&#xff1a; 一、环境的部署 二、本地…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...