当前位置: 首页 > 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; 一、环境的部署 二、本地…...

深度学习_YOLO,卡尔曼滤波和

1.YOLO 1.1 简介 YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利用anchor box将分类与目标定位的回归问题结合起来&#xff0c;从而做到了高效、灵活和泛化性能好&#xff0c;所以在工业界也十分受欢迎. Yolo算法采用一个单独的CNN模型实现end-to-end的目标检…...

从原理到选型:WDM波分复用技术全解析与应用指南

1. WDM波分复用技术基础入门 第一次接触WDM这个概念是在2013年参加某运营商骨干网改造项目时。当时客户指着机房密密麻麻的光纤问我&#xff1a;"能不能在不更换现有光缆的情况下&#xff0c;把传输容量提升8倍&#xff1f;"这个问题直接把我问住了。后来在华为专家的…...

小团队福音:用两台服务器搞定Redis高可用(Keepalived+互为主从配置)

小团队福音&#xff1a;用两台服务器构建轻量级Redis高可用架构 在初创公司和小型技术团队中&#xff0c;服务器资源往往捉襟见肘。当业务需要Redis作为缓存或数据库时&#xff0c;传统的高可用方案如哨兵模式需要至少三台服务器&#xff0c;这对资源有限的团队来说可能过于奢侈…...

归并排序力扣题(leetcode)何

1.概述在人工智能快速发展的今天&#xff0c;AI不再仅仅是回答问题的聊天机器人&#xff0c;而是正在演变为能够主动完成复杂任务的智能代理。OpenAI的Codex CLI就是这一趋势的典型代表——一个跨平台的本地软件代理&#xff0c;能够在用户的机器上安全高效地生成高质量的软件变…...

AI时代新型的项目管理应该是什么样的?嗣

AI训练存储选型的演进路线 第一阶段&#xff1a;单机直连时代 早期的深度学习数据集较小&#xff0c;模型训练通常在单台服务器或单张GPU卡上完成。此时直接将数据存储在训练机器的本地NVMe SSD/HDD上。 其优势在于IO延迟最低&#xff0c;吞吐量极高&#xff0c;也就是“数据离…...

Swup滚动管理完全指南:页面切换时的智能定位技术终极教程

Swup滚动管理完全指南&#xff1a;页面切换时的智能定位技术终极教程 【免费下载链接】swup Versatile and extensible page transition library for server-rendered websites &#x1f389; 项目地址: https://gitcode.com/gh_mirrors/sw/swup Swup是一款功能强大且可…...

Bootstrap Switch 终极指南:如何快速创建现代化切换开关

Bootstrap Switch 终极指南&#xff1a;如何快速创建现代化切换开关 【免费下载链接】bootstrap-switch Turn checkboxes and radio buttons in toggle switches. 项目地址: https://gitcode.com/gh_mirrors/bo/bootstrap-switch Bootstrap Switch 是一款强大的开源工具…...

Spring 事务从入门到精通:一篇搞定事务失效、传播行为、回滚规则(Spring系列10)

一、前言 在日常开发中&#xff0c;事务是保证数据一致性的核心手段。尤其是转账这类业务&#xff0c;必须保证「A减钱」和「B加钱」两个操作同成功、同失败&#xff0c;否则就会出现资金异常。 Spring 提供了一套完整的声明式事务解决方案&#xff0c;基于 AOP 实现&#xff0…...

黑马点评实战篇知识点整理-秒杀进阶

异步秒杀思路问题&#xff1a;串行执行&#xff0c;性能不行&#xff08;查询库存&#xff0c;查询订单&#xff0c;扣减库存&#xff0c;写入订单&#xff0c;全是数据库&#xff0c;还加了锁&#xff0c;性能不行&#xff09;把判断秒杀资格和一人一单放到redis里保存用户id&…...

SDMatte与3D引擎结合:实时渲染中的动态遮罩应用

SDMatte与3D引擎结合&#xff1a;实时渲染中的动态遮罩应用 1. 引言&#xff1a;当AI遮罩遇上实时渲染 想象一下&#xff0c;在游戏开发中需要让角色逐渐消失的特效&#xff0c;传统做法可能需要美术师逐帧绘制遮罩。现在&#xff0c;通过SDMatte与3D引擎的结合&#xff0c;我…...