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

windows C++-高级并发和异步(三)

深入了解 winrt::resume_foreground(下)

调用 winrt::resume_foreground 时会始终先排队,然后展开堆栈。 也可选择设置恢复优先级。

winrt::fire_and_forget RunAsync(DispatcherQueue queue)
{...co_await winrt::resume_foreground(queue, DispatcherQueuePriority::High);...
}

或者,使用默认的排队顺序。 

...
#include <winrt/Windows.System.h>
using namespace Windows::System;
...
winrt::fire_and_forget RunAsync(DispatcherQueue queue)
{...co_await queue;...
}

如上所示,请确保包含要 co_await 的类型的命名空间的投影标头。 例如 Windows::UI::Core::CoreDispatcher、Windows::System::DispatcherQueue 或 Microsoft::UI::Dispatching::DispatcherQueue。 

或者,检测队列关闭情况并对其进行适当处理,如以下示例所示。

winrt::fire_and_forget RunAsync(DispatcherQueue queue)
{...if (co_await queue){... // Resume on dispatcher thread.}else{... // Still on calling thread.}
}

 co_await 表达式返回 true,表明会在调度程序线程上进行恢复。 换而言之,该排队操作是成功的。 与之相反的是返回 false,这表明执行仍保留在调用线程上,因为队列的控制器关闭,再也不能处理队列请求。

因此,在将 C++/WinRT 与协同程序配合使用的情况下,尤其是在进行一些传统的 Petzold 样式桌面应用程序开发的情况下,你拥有很大的控制权限。

 取消异步操作和取消回调

使用 Windows 运行时的异步编程功能可以取消正在进行的异步操作或运算。 以下示例调用 StorageFolder::GetFilesAsync 来检索可能较大的文件集合,并将生成的异步操作对象存储在数据成员中。 用户可以选择取消该操作。

// MainPage.xaml
...
<Button x:Name="workButton" Click="OnWork">Work</Button>
<Button x:Name="cancelButton" Click="OnCancel">Cancel</Button>
...// MainPage.h
...
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Storage.Search.h>using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::Storage;
using namespace Windows::Storage::Search;
using namespace Windows::UI::Xaml;
...
struct MainPage : MainPageT<MainPage>
{MainPage(){InitializeComponent();}IAsyncAction OnWork(IInspectable /* sender */, RoutedEventArgs /* args */){workButton().Content(winrt::box_value(L"Working..."));// Enable the Pictures Library capability in the app manifest file.StorageFolder picturesLibrary{ KnownFolders::PicturesLibrary() };m_async = picturesLibrary.GetFilesAsync(CommonFileQuery::OrderByDate, 0, 1000);IVectorView<StorageFile> filesInFolder{ co_await m_async };workButton().Content(box_value(L"Done!"));// Process the files in some way.}void OnCancel(IInspectable const& /* sender */, RoutedEventArgs const& /* args */){if (m_async.Status() != AsyncStatus::Completed){m_async.Cancel();workButton().Content(winrt::box_value(L"Canceled"));}}private:IAsyncOperation<::IVectorView<StorageFile>> m_async;
};
...

 让我们通过一个简单的示例开始了解取消的实现端。 

// main.cpp
#include <iostream>
#include <winrt/Windows.Foundation.h>using namespace winrt;
using namespace Windows::Foundation;
using namespace std::chrono_literals;IAsyncAction ImplicitCancelationAsync()
{while (true){std::cout << "ImplicitCancelationAsync: do some work for 1 second" << std::endl;co_await 1s;}
}IAsyncAction MainCoroutineAsync()
{auto implicit_cancelation{ ImplicitCancelationAsync() };co_await 3s;implicit_cancelation.Cancel();
}int main()
{winrt::init_apartment();MainCoroutineAsync().get();
}

 如果运行上述示例,则你会看到,ImplicitCancellationAsync 在三秒钟内每秒输出一条消息,然后,它会由于执行了取消操作而自动终止。 之所以此行为是可行的,是因为在遇到 co_await 表达式时,协同例程会检查它是否已取消。 如果已取消,则它会短路掉,否则它会像正常情况下一样暂停。

当然,取消也可以在协同例程暂停时发生。 仅当协同例程恢复或者遇到另一个 co_await 时,它才会检查取消状态。 问题在于,在响应取消时可能会出现过于粗糙粒度的延迟。

因此,另一种做法是从协同例程内部显式轮询取消。 使用以下列表中的代码更新上述示例。 在此新示例中,ExplicitCancelationAsync 检索 winrt::get_cancellation_token 函数返回的对象,并使用该对象定期检查是否已取消协同例程。 只要尚未取消,协同例程就会无限循环;一旦取消,循环和函数就会正常退出。 结果与前一个示例相同,不过,在此示例中,退出是显式发生的并且受控。

IAsyncAction ExplicitCancelationAsync()
{auto cancelation_token{ co_await winrt::get_cancellation_token() };while (!cancelation_token()){std::cout << "ExplicitCancelationAsync: do some work for 1 second" << std::endl;co_await 1s;}
}IAsyncAction MainCoroutineAsync()
{auto explicit_cancelation{ ExplicitCancelationAsync() };co_await 3s;explicit_cancelation.Cancel();
}
...

等待 winrt::get_cancellation_token 时会使用协同例程代表你生成的 IAsyncAction 信息检索取消标记。 可以针对该标记使用函数调用运算符以查询取消状态,实质上是轮询取消。 如果执行某项计算资源受限的操作,或循环访问大型集合,则这是一种合理的方法。 

相关文章:

windows C++-高级并发和异步(三)

深入了解 winrt::resume_foreground(下) 调用 winrt::resume_foreground 时会始终先排队&#xff0c;然后展开堆栈。 也可选择设置恢复优先级。 winrt::fire_and_forget RunAsync(DispatcherQueue queue) {...co_await winrt::resume_foreground(queue, DispatcherQueuePrior…...

河北移动:核心系统数据库成功完成整体迁移 ,实现全栈国产|OceanBase案例

本文作者&#xff1a;移动通信集团河北有限公司架构规划专家&#xff0c;房瑞 项目背景&#xff1a; 中国移动通信集团河北有限公司一直在积极响应国家及集团的号召&#xff0c;以磐舟&磐基云原生为底座&#xff0c;结合国产浏览器、中间件、数据库、操作系统和服务器等&a…...

ZKRollup

目录 ZKRollup 基本概念 运作原理 特点与优势 应用场景 典型项目 ZKRollup ZKRollup,全称为Zero-Knowledge Rollup,是一种基于零知识证明的二层扩容方案(Layer 2)。它旨在通过提高交易处理效率和降低交易成本来扩展区块链网络的能力,尤其是在以太坊等区块链平台上得…...

letcode 分类练习 树的遍历

letcode 分类练习 树的遍历 树的构建递归遍历前序遍历中序遍历后序遍历 迭代遍历前序遍历中序遍历后序遍历 层序遍历层序遍历可以解决的问题107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值429. N 叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的…...

redisssion分布式锁

分布式锁的问题 基于setnx的分布式锁实现起来并不复杂&#xff0c;不过却存在一些问题。 锁误删问题 第一个问题就是锁误删问题&#xff0c;目前释放锁的操作是基于DEL&#xff0c;但是在极端情况下会出现问题。 例如&#xff0c;有线程1获取锁成功&#xff0c;并且执行完任…...

嘎嘎嘎拿到去年想要的包

一年多了 继续&#xff0c;把项目收尾吧 好好学前端&#xff0c;外企&#xff01;react&#xff01;从0开始&#xff0c;紧迫&#xff01;加油&#xff01;...

前奏编曲:如何编写二段式前奏

选好音源 Pianoteq 6 STAGE比较明亮些&#xff0c;适合做前奏的音源 确定和弦进行 比如4536251&#xff0c;每个小节2和弦&#xff0c;每个小节的和弦弹一下 优化和弦进行衔接和织体 二段式不用对和弦进行就近解决的处理&#xff0c;因为前奏前后要形成对比。 前半部分往…...

征服云端:Kubernetes如何让微服务与云原生技术如虎添翼

引言 在这个数字化转型的时代&#xff0c;微服务架构已经成为构建现代应用程序的首选方式。它不仅提高了开发效率&#xff0c;还增强了系统的可扩展性和灵活性。而随着云计算技术的迅猛发展&#xff0c;云原生的概念逐渐深入人心&#xff0c;它代表了一种全新的软件开发方法论…...

开源AI智能名片系统与高级机器学习技术的融合应用:重塑商务交流的未来

摘要&#xff1a;在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;技术&#xff0c;尤其是机器学习领域的快速发展&#xff0c;正深刻改变着各行各业的面貌。开源AI智能名片系统作为这一变革的先锋&#xff0c;通过集成并优化多种高级机器学习技术&#xf…...

Java中synchronized的偏向锁是如何减少锁开销的

偏向锁&#xff08;Biased Locking&#xff09;是一种优化 Java synchronized 锁的机制&#xff0c;旨在减少在无竞争情况下的锁开销。它通过将锁偏向于单个线程来优化锁的性能。以下是偏向锁减少锁开销的具体方式和原理&#xff1a; 偏向锁的工作原理 锁的初始状态: 当一个对…...

react18 + ts 使用video.js 直播.m3u8格式的视频流

一、安装依赖 我使用的video.js版本是8.17.3&#xff0c;从 Video.js 7.x 开始&#xff0c;HLS 支持被内置到了 Video.js 中所以不需要安装其他依赖 npm i video.js 二、创建VideoPlayer组件 import React, { useEffect, useRef } from react import videojs from video.js …...

使用 onBeforeRouteLeave 组合式函数提升应用的用户体验

title: 使用 onBeforeRouteLeave 组合式函数提升应用的用户体验 date: 2024/8/14 updated: 2024/8/14 author: cmdragon excerpt: 摘要&#xff1a;本文介绍了在Nuxtjs中使用onBeforeRouteLeave组合式函数来提升应用用户体验的方法。onBeforeRouteLeave允许在组件离开当前路…...

uni-app 吸顶方案总结

效果 页面级 uni.pageScrollTo 官方文档&#xff1a;https://uniapp.dcloud.net.cn/api/ui/scroll.html#pagescrollto 原生头部导航 uni.pageScrollTo({selector: #tabs,duration: 300 });(推荐)需要兼容自定义头部导航 <template><view id"demo1" :styl…...

【C#】知识汇总

目录 1 概述1.1 GC&#xff08;Garbage Collection&#xff09;1.1.1 为什么需要GC&#xff1f;1.1.2 GC的工作原理工作原理什么是Root&#xff1f;GC算法&#xff1a;Mark-Compact 标记压缩算法GC优化&#xff1a;Generational 分代算法 1.1.3 GC的触发时间1.1.4 如何减少垃圾…...

1、Unity【基础】3D数学

3D数学 文章目录 3D数学1、数学计算公共类Mathf1、Mathf和Math2、区别3、Mathf中的常用方法&#xff08;一般计算一次&#xff09;4、Mathf中的常用方法&#xff08;一般不停计算&#xff09;练习 A物体跟随B物体移动 2、三角函数1、角度和弧度2、三角函数3、反三角函数练习 物…...

虚拟机ubuntu22的扩容记录

这里lsblk命令能看到&#xff0c; ubuntu逻辑分区只有29G&#xff0c; 但总分区60G&#xff0c;还有接近30G未使用。 rootx:/home/x# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 63.9M 1 loop /snap/core2…...

Docker 常用配置

Docker 常用配置 1. 配置方法 修改下面位置&#xff1a; Linux&#xff1a;vim /etc/docker/daemon.jsonmacOS&#xff1a;菜单栏图标->Settings->Docker Engine 注意&#xff1a;修改完需要重启Docker Linux&#xff1a;systemctl restart dockermacOS&#xff1a;…...

通过示例了解 .NET Core 中的依赖注入

依赖注入 (DI) 是一种用于实现 IoC&#xff08;控制反转&#xff09;的设计模式&#xff0c;可以更好地解耦应用程序内的依赖关系并更轻松地管理它们。.NET Core 内置了对依赖注入的支持&#xff0c;提供了一种有效管理依赖关系的强大方法。 一.什么是依赖注入&#xff1f; 依…...

fetch、FormData上传多张图片

利用fetch方法和FormData对象上传多张图片 formdata()对象可以序列化多张图片 <html><head><meta http-equiv"content-type" content"text/html;charsetUTF-8"/><title>测试fetch和formdata上传多张图片</title></head&…...

C++STL详解(五)——list类的具体实现

一.本次所需实现的三个类及其成员函数接口 链表首先要有结点&#xff0c;因此我们需要实现一个结点类。 链表要有管理结点的结构&#xff0c;因此我们要有list类来管理结点。 链表中还要有迭代器&#xff0c;而迭代器的底层其实是指针。但是我们现有的结点类无法完成迭代器的…...

探索 Carsim 与 Simulink 联合实现三车队列 PID 控制

队列控制 carsim联合simulink pid控制 实现3辆车的队列控制&#xff0c;跟随头车车速变化&#xff0c;保合理车距。在自动驾驶和车辆动力学研究领域&#xff0c;实现多车队列控制&#xff0c;使其能跟随头车车速变化并保持合理车距&#xff0c;是一项极具挑战性但又十分关键的任…...

单光子雪崩二极管(SPAD):原理、极高增益机制与微光探测解析

摘要 单光子雪崩二极管(Single-Photon Avalanche Diode, SPAD)是当前量子通信、激光雷达(LiDAR)、生物荧光成像及弱光探测领域的核心器件。其最显著的特征在于能够探测单个光子级别的极微弱光信号。本文将从器件物理层面深入剖析SPAD如何通过工作在“盖革模式”(Geiger M…...

Path of Building完全指南:3步掌握流放之路最强Build规划与天赋计算神器

Path of Building完全指南&#xff1a;3步掌握流放之路最强Build规划与天赋计算神器 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding Path of Building是《流放之路》玩家…...

OpenClaw对话式编程:Qwen3.5-9B解释代码与生成可执行脚本

OpenClaw对话式编程&#xff1a;Qwen3.5-9B解释代码与生成可执行脚本 1. 为什么需要对话式编程助手&#xff1f; 作为一个经常需要写脚本处理数据的开发者&#xff0c;我发现自己80%的时间都花在重复性工作上&#xff1a;查文档、调试语法错误、验证代码逻辑。直到尝试用Open…...

还在手工整理IT报表?这套自动化模板让你彻底解放双手

在不断变化的IT管理环境中&#xff0c;透明度和合规性已成为企业生存和发展的基石。面对日益繁杂的法规与标准&#xff0c;组织需要精细的报表与审计流程来支撑业务稳健运行。作为一款专为现代IT打造的尖端平台&#xff0c;Endpoint Central不仅大幅减轻了合规负担&#xff0c;…...

LFM2.5-1.2B-Thinking部署教程:3步实现Python爬虫数据智能处理

LFM2.5-1.2B-Thinking部署教程&#xff1a;3步实现Python爬虫数据智能处理 1. 引言 你是不是经常遇到这样的问题&#xff1a;爬虫抓取了一大堆数据&#xff0c;但面对杂乱无章的文本内容却无从下手&#xff1f;手动整理不仅耗时耗力&#xff0c;还容易出错。现在&#xff0c;…...

南北阁 4.1-3B 开源镜像实战:Streamlit轻量化UI+CoT折叠展示一文详解

南北阁 4.1-3B 开源镜像实战&#xff1a;Streamlit轻量化UICoT折叠展示一文详解 想快速体验一个能在本地流畅运行、还能“看见”模型思考过程的智能对话工具吗&#xff1f;今天要介绍的&#xff0c;就是基于南北阁&#xff08;Nanbeige&#xff09;4.1-3B模型打造的轻量化流式…...

LFM2.5-1.2B-Thinking-GGUF效果展示:同一Prompt下Thinking中间态与终版回答对比图

LFM2.5-1.2B-Thinking-GGUF效果展示&#xff1a;同一Prompt下Thinking中间态与终版回答对比图 1. 模型简介 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型&#xff0c;特别适合在资源有限的环境中快速部署和使用。该模型采用GGUF格式存储&#xff0c;通过ll…...

从数据包到DMA:图解GMAC传输描述符的完整生命周期(含TSO/VLAN案例)

从数据包到DMA&#xff1a;图解GMAC传输描述符的完整生命周期&#xff08;含TSO/VLAN案例&#xff09; 在网络硬件加速领域&#xff0c;GMAC&#xff08;Gigabit Media Access Control&#xff09;接口的传输描述符机制是提升数据吞吐效率的核心技术之一。本文将深入剖析一个网…...

图像分割损失函数调参指南:如何用Focal Loss拯救你的小目标检测模型

图像分割损失函数调参指南&#xff1a;如何用Focal Loss拯救你的小目标检测模型 当你在处理卫星图像中的微小建筑物或显微图像里的稀有细胞时&#xff0c;是否经常遇到模型对前景目标"视而不见"的情况&#xff1f;传统交叉熵损失在面对这种极端类别不平衡时往往力不从…...