windows C++- WRL 使用计时器

news/2024/9/18 15:04:32/ 标签: c++, 开发语言

由于WRL技术已经不作为主流继续发展,所以这里这个文档主要是收录WRL作为一些特殊情况下的查阅和理解windows体系开发的技术脉络,故本文档仅仅演示各项关键技术,例如本文档如何使用 Windows 运行时 C++ 模板库 (WRL) 启动异步操作并在操作完成时执行工作,而不是详细解释内部运行的机制。

本文档演示启动异步计时器,并等待计时器过期。 在此示例中,在创建计时器对象时指定异步操作。 Callback 函数是这个示例的重要组成部分,因为示例可以通过该函数指定事件处理程序来处理异步操作的结果。

这些示例使用 Lambda 表达式来定义回调。 还可以使用函数对象(函数)、函数指针或 std::function 对象。

示例:使用计时器

以下步骤启动异步计时器并等待计时器过期。 之后提供了完整示例。

尽管通常在通用 Windows 平台 (UWP) 应用中使用 Windows 运行时 C++ 模板库,但此示例使用控制台应用进行演示。

1. 包括 (#include) 任何所需的 Windows 运行时、Windows 运行时 C++ 模板库或 C++ 标准库头文件。 

#include <Windows.Foundation.h>
#include <Windows.System.Threading.h>
#include <wrl/event.h>
#include <stdio.h>
#include <Objbase.h>using namespace ABI::Windows::Foundation;
using namespace ABI::Windows::System::Threading;
using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;

Windows.System.Threading.h 声明使用异步计时器所需的类型。我们建议您在 .cpp 文件中使用 using namespace 指令使代码更具可读性。

2.  初始化 Windows 运行时。

// Initialize the Windows Runtime.
RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);
if (FAILED(initialize))
{return PrintError(__LINE__, initialize);
}

3. 为 ABI::Windows::System::Threading::IThreadPoolTimer 接口创建激活工厂。

// Get the activation factory for the IThreadPoolTimer interface.
ComPtr<IThreadPoolTimerStatics> timerFactory;
HRESULT hr = GetActivationFactory(HStringReference(RuntimeClass_Windows_System_Threading_ThreadPoolTimer).Get(), &timerFactory);
if (FAILED(hr))
{return PrintError(__LINE__, hr);
}

Windows 运行时使用完全限定名来标识类型。 RuntimeClass_Windows_System_Threading_ThreadPoolTimer 参数是 Windows 运行时提供的字符串,其中包含所需的运行时类名称。 

4. 创建一个将计时器回调同步到主应用的 Event 对象。

// Create an event that is set after the timer callback completes. We later use this event to wait for the timer to complete. 
// This event is for demonstration only in a console app. In most apps, you typically don't wait for async operations to complete.
Event timerCompleted(CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, WRITE_OWNER | EVENT_ALL_ACCESS));
hr = timerCompleted.IsValid() ? S_OK : HRESULT_FROM_WIN32(GetLastError());
if (FAILED(hr))
{return PrintError(__LINE__, hr);
}

此事件仅作为控制台应用的一部分进行演示。 此示例使用该事件确保退出应用之前完成异步操作。 在大多数应用中,你通常不会等待异步操作完成。 

5. 创建一个在两秒后过期的 IThreadPoolTimer 对象。 使用 Callback 函数创建事件处理程序(ABI::Windows::System::Threading::ITimerElapsedHandler 对象)。 

// Create a timer that prints a message after 2 seconds.TimeSpan delay;
delay.Duration = 20000000; // 2 seconds.auto callback = Callback<ITimerElapsedHandler>([&timerCompleted](IThreadPoolTimer* timer) -> HRESULT
{wprintf_s(L"Timer fired.\n");TimeSpan delay;HRESULT hr = timer->get_Delay(&delay);if (SUCCEEDED(hr)){wprintf_s(L"Timer duration: %2.2f seconds.\n", delay.Duration / 10000000.0);}// Set the completion event and return.SetEvent(timerCompleted.Get());return hr;
});
hr = callback ? S_OK : E_OUTOFMEMORY;
if (FAILED(hr))
{return PrintError(__LINE__, hr);
}ComPtr<IThreadPoolTimer> timer;
hr = timerFactory->CreateTimer(callback.Get(), delay, &timer);
if (FAILED(hr))
{return PrintError(__LINE__, hr);
}

6. 将消息输出到控制台,并等待计时器回调完成。 所有 ComPtr 和 RAII 对象都离开范围并自动释放。

// Print a message and wait for the timer callback to complete.
wprintf_s(L"Timer started.\nWaiting for timer...\n");// Wait for the timer to complete.
WaitForSingleObjectEx(timerCompleted.Get(), INFINITE, FALSE);
// All smart pointers and RAII objects go out of scope here.

完整代码如下:

// wrl-consume-async.cpp
// compile with: runtimeobject.lib
#include <Windows.Foundation.h>
#include <Windows.System.Threading.h>
#include <wrl/event.h>
#include <stdio.h>
#include <Objbase.h>using namespace ABI::Windows::Foundation;
using namespace ABI::Windows::System::Threading;
using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;// Prints an error string for the provided source code line and HRESULT
// value and returns the HRESULT value as an int.
int PrintError(unsigned int line, HRESULT hr)
{wprintf_s(L"ERROR: Line:%d HRESULT: 0x%X\n", line, hr);return hr;
}int wmain()
{// Initialize the Windows Runtime.RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);if (FAILED(initialize)){return PrintError(__LINE__, initialize);}// Get the activation factory for the IThreadPoolTimer interface.ComPtr<IThreadPoolTimerStatics> timerFactory;HRESULT hr = GetActivationFactory(HStringReference(RuntimeClass_Windows_System_Threading_ThreadPoolTimer).Get(), &timerFactory);if (FAILED(hr)){return PrintError(__LINE__, hr);}// Create an event that is set after the timer callback completes. We later use this event to wait for the timer to complete. // This event is for demonstration only in a console app. In most apps, you typically don't wait for async operations to complete.Event timerCompleted(CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, WRITE_OWNER | EVENT_ALL_ACCESS));hr = timerCompleted.IsValid() ? S_OK : HRESULT_FROM_WIN32(GetLastError());if (FAILED(hr)){return PrintError(__LINE__, hr);}// Create a timer that prints a message after 2 seconds.TimeSpan delay;delay.Duration = 20000000; // 2 seconds.auto callback = Callback<ITimerElapsedHandler>([&timerCompleted](IThreadPoolTimer* timer) -> HRESULT{wprintf_s(L"Timer fired.\n");TimeSpan delay;HRESULT hr = timer->get_Delay(&delay);if (SUCCEEDED(hr)){wprintf_s(L"Timer duration: %2.2f seconds.\n", delay.Duration / 10000000.0);}// Set the completion event and return.SetEvent(timerCompleted.Get());return hr;});hr = callback ? S_OK : E_OUTOFMEMORY;if (FAILED(hr)){return PrintError(__LINE__, hr);}ComPtr<IThreadPoolTimer> timer;hr = timerFactory->CreateTimer(callback.Get(), delay, &timer);if (FAILED(hr)){return PrintError(__LINE__, hr);}// Print a message and wait for the timer callback to complete.wprintf_s(L"Timer started.\nWaiting for timer...\n");// Wait for the timer to complete.WaitForSingleObjectEx(timerCompleted.Get(), INFINITE, FALSE);// All smart pointers and RAII objects go out of scope here.
}
/*
Output:
Timer started.
Waiting for timer...
Timer fired.
Timer duration: 2.00 seconds.
*/

http://www.ppmy.cn/news/1516970.html

相关文章

.ipynb文件:交互式 Jupyter Notebook

Python 接口文件&#xff08;带有扩展名的文件.pyi&#xff09;&#xff0c;或称为 Python 存根文件&#xff0c;在使用类型提示增强 Python 代码方面发挥着至关重要的作用。 当你遇到名称以 .ipynb、.pyi、.pyc 等结尾的 Python 文件时&#xff0c;你是否会感到困惑&#xff…

asp.net core在win上的发布和部署

一、asp.net core两种发布方式 1、两个发布方式——【框架依赖发布】和【独立发布】 2、两种发布方式的差别 二、发布的详细过程 1、【生成】->【发布】 2、框架依赖发布 设置发布参数&#xff0c;然后进行发布 发布好的文件&#xff0c;把它们放到一个新的目录文件夹里 …

LLaMA Factory微调Llama3模型

LLaMA Factory是一款开源低代码大模型微调框架&#xff0c;集成了业界最广泛使用的微调技术&#xff0c;支持通过Web UI界面零代码微调大模型&#xff0c;目前已经成为开源社区内最受欢迎的微调框架。 &#x1f4a5;GPU推荐使用24GB显存的A10&#xff08;ecs.gn7i-c8g1.2xlarg…

百度:未来or现在 顾此失彼?

用AI押注未来&#xff0c;却丢了现在 国内AI先行者百度 走到哪了&#xff1f; 作为这个星球最热门的概念&#xff0c;AI无疑是个好故事&#xff0c;不只是百度&#xff0c;美股的一众科技公司几乎都在讲述自己的AI投入及发展成果&#xff0c;市值也随着AI预期坐过山车。而市场…

css基础学习总结(一)

文章目录 一. 选择器1. 标签选择器2. 类选择器3. ID选择器4. 分组选择器5. 派生与子元素选择器6. 属性选择器7. 伪类选择器8. 伪对象选择器9. 选择器的优先级别css优先级 的 6大分类 一. 选择器 1. 标签选择器 选择器例子描述elementp/div/span选择所有含有指定标签的元素 &…

神经网络参数个数的计算

计算神经网络中参数的个数取决于网络的结构&#xff0c;包括层的类型和每层的节点数。以下是一些常见层类型的参数计算方法&#xff1a; 全连接层&#xff08;Fully Connected Layer&#xff09;&#xff1a; 参数个数 输入节点数 输出节点数 输出节点数&#xff08;偏置项…

什么是数据库 DevOps?

原文地址 https://www.bytebase.com/blog/what-is-database-devops/ 在深入研究数据库 DevOps 之前&#xff0c;先回顾一下什么是 DevOps。它没有统一的定义&#xff0c;但我们知道它起源于软件开发方法与部署和运维的结合。 大约 2007 年和 2008 年&#xff0c;软件开发和 I…

中国高校发表科技论文及著作数量数据集(2009-2022年)

中国各地区的高校科技产出数据&#xff0c;包括27个指标&#xff0c;科技论文发表、著作出版、专利申请、专利转让、国家标准项等。这些指标综合反映了各地区高校在科学研究和技术开发方面的活跃程度及创新能力 一、数据介绍 数据名称&#xff1a;中国地区高校发表科技论文、…

TCP/IP 协议:互联网的基石

TCP/IP 协议:互联网的基石 引言 TCP/IP协议,全称为传输控制协议/互联网协议(Transmission Control Protocol/Internet Protocol),是现代互联网通信的基础。自20世纪70年代末期以来,TCP/IP协议已经成为全球互联网通信的通用语言,它定义了数据如何在网络上进行传输和路由…

【代码随想录训练营第42期 Day38打卡 - 动态规划Part6 - LeetCode 322. 零钱兑换 279.完全平方数 139.单词拆分

目录 一、做题心得 二、题目与题解 题目一&#xff1a;322. 零钱兑换 题目链接 题解&#xff1a;动态规划--完全背包 题目二&#xff1a; 279.完全平方数 题目链接 题解&#xff1a;动态规划--完全背包 题目三&#xff1a;139.单词拆分 题目链接 题解&#xff1a;动…

云轴科技ZStack AIOS平台智塔亮相FDS金融领袖峰会

人工智能&#xff08;AI&#xff09;正以前所未有的速度渗透到金融系统&#xff0c;推动着金融服务的创新和变革。这种深度融合不仅可以提高金融服务的效率和准确性&#xff0c;未来还可催生全新的金融产品和服务模式。尤其是生成式人工智能&#xff08;GenAI&#xff09;的出现…

系统分析师5-数据库特训专题

文章目录 1 数据库设计概述2 规范化与反规范化2.1 规范化2.2 反规范化2.3 案例分析例题1 3 数据库索引与视图的应用3.1 数据库索引3.2 数据库视图3.3 案例分析例题2 4 分布式数据库系统5 数据库分区分表分库5.1 案例分析例题3 6 分布式事务增补6.1 案例分析例题4 7 NoSQL8 附录…

redis实战——go-redis的使用与redis基础数据类型的使用场景(二)

一.go-redis操作hash 常用命令&#xff1a; redisClient.HSet("map", "name", "jack") // 批量设置 redisClient.HMSet("map", map[string]interface{}{"a": "b", "c": "d", "e"…

如何使用ssm实现基于SSM的旅游管理系统

TOC ssm285基于SSM的旅游管理系统jsp 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行业&…

三级_网络技术_50_综合题(报文)

一、 下图是校园网某台主机在命令行模式执行某个命令时用wireshark捕获的数据包 请根据图中信息回答下列问题。 (1)该主机上执行的命令是__________ (2)该主机上使用的DNS服务器的IP地址是__________ (3)该主机的IP地址是__________ 该主机的MAC地址是__________ (4)主机…

网络安全的历史

如今&#xff0c;网络安全几乎成为各大公司和利益相关者关注的焦点。但在早期&#xff0c;网络安全的概念非常模糊。 直到多年以后&#xff0c;由于网络攻击和危险实体威胁的频繁发生&#xff0c;网络安全的发展才受到重视。这些措施的发展成为了网络安全的演变。 网络安全起…

Nginx 负载均衡详解

一、Nginx 简介 Nginx 是一个高性能的开源 Web 服务器和反向代理服务器&#xff0c;以其轻量级、高并发、低内存消耗等特点著称。Nginx 不仅适用于静态资源的快速分发&#xff0c;还广泛应用于负载均衡、反向代理等场景。通过Nginx&#xff0c;可以轻松地构建一个高效、可靠且…

8月27复盘日记

8月27复盘日记 前言今日感恩今日知识今日反思今日名言 前言 今天早上是七点半起床嘻嘻&#xff0c;昨晚和舍友聊天&#xff0c;分享小时候的趣事&#xff0c;以及一些观点&#xff0c;聊得有些激动&#xff0c;就比较难以入睡   今天天气又是超级让人幸福&#xff01;&#x…

【ansible】ansible roles

ansible roles 简介 Ansible Roles是一种组织和管理Ansible Playbooks的方法。它们允许将相关的配置和任务分组到一个可重用的单元中&#xff0c;使得代码更加模块化和可维护。 一个Ansible Role包含了一组预定义的变量、任务和文件结构。它可以被其他Playbooks调用和使用&am…

Nginx IP 限制与路径访问控制配置

Nginx IP 限制与路径访问控制配置 1. 简介 在某些应用场景下&#xff0c;特定路径需要免登录访问&#xff0c;但为了安全考虑&#xff0c;限制只有指定的 IP 地址才能访问该路径。本文档描述了如何在 Nginx 中配置 IP 限制&#xff0c;并在未授权访问时返回 401 Unauthorized…