2602C++,窗运异步
C/WinRT是微软为窗口运行时提供的现代C17语言投影.2018年引入.窗口SDK版本10.0.17134.0(Windows101803).这里不介绍CWinRT其他,只介绍它提供的异步能力:异步操作方法假设我有个耗时很久的方法,我不希望它阻塞UI线程,那你可这样:#includedispatcherqueue.h#includewinrt/base.h#includewinrt/Windows.System.h#includewinrt/Windows.Foundation.hwinrt::Windows::Foundation::IAsyncActionreadImg(){co_awaitwinrt::resume_background();//这里省略了耗时很长的逻辑代码co_awaitwinrt::resume_foreground(dq);}这里,winrt::Windows::Foundation::IAsyncAction代表一个无结果,无进度的异步操作.除此外,WinRT提供了如下异步操作类型:类型返回值进度报告使用场景IAsyncAction无无简单异步操作IAsyncActionWithProgress无有需要进度反馈的操作IAsyncOperation有无返回结果的异步操作IAsyncOperationWithProgress有有返回结果且需进度的操作如果要在一个方法中使用co_await操作异步逻辑,则你就要按co_await兼容的方法标记该方法,比如返回IAsyncAction类型.co_await winrt::resume_background()是C/WinRT提供的切换线程的助手函数,来从当前线程切换到后台线程(背后有线程池).该操作是非阻塞的.co_await winrt::resume_foreground(dq)负责从后台线程切换到当前线程.是不是比C标准库里的异步操作要简单的多呢?dq是什么?线程任务调度对象winrt::Windows::System::DispatcherQueue dq是C/WinRT中用来管理线程任务调度的核心类,它管理按偏爱级排列的任务队列,确保在线程上串行执行任务.该类型的对象有以下特点:1,每线程最多有1个DispatcherQueue2,可向该线程投递异步任务3,任务按优先级排队执行4,依赖线程消息循环(MessageLoop)在启动应用时,就创建了管理UI线程的任务队列的该dq对象.winrt::Windows::System::DispatcherQueue dq;dq{winrt::Windows::System::DispatcherQueue::GetForCurrentThread()}在WinUI3或UWP项中,用上述代码就可直接得到dq.传统的Win32项,必须要提前执行如下逻辑,才能得到dq.(DispatcherQueue不是Win32线程的默认组成部分)winrt::init_apartment(winrt::apartment_type::single_threaded);DispatcherQueueOptions options{sizeof(DispatcherQueueOptions),DQTYPE_THREAD_CURRENT,DQTAT_COM_STA};staticwinrt::Windows::System::DispatcherQueueController controller{nullptr};autohrCreateDispatcherQueueController(options,reinterpret_castABI::Windows::System::IDispatcherQueueController**(winrt::put_abi(controller)));不要掐死UI线程假设有如下用来取剪切板内文本的异步代码.IAsyncOperationwinrt::hstringUtil::getTextFromClipboard(){autoviewClipboard::GetContent();if(view.Contains(StandardDataFormats::Text())){co_returnco_awaitview.GetTextAsync();}co_returnL;}如果如下取剪切板内的文本autostrgetTextFromClipboard().get();此时可能会报如下错误:这是因为:1,.get()阻塞当前线程等待异步完成2,异步操作内部需要调度到UI线程执行Clipboard,API(操作剪切板的API的要求)3,但你阻塞了当前UI线程(.get()没返回)4,无法运行消息循环,无法调度5,WinRT检测到该UI线程无法响应,则抛!is_sta_thread.方案就是不要掐死UI线程autostrOpUtil::getTextFromClipboard2();strOp.Completed([this](autoconstsender,autostatus){autostrsender.GetResults();});或使用co_await调用getTextFromClipboard方法,来把这段逻辑也包在IAsyncAction方法中.

相关新闻

【毕业设计】SpringBoot+Vue+MySQL 绿城郑州爱心公益网站平台源码+数据库+论文+部署文档

【毕业设计】SpringBoot+Vue+MySQL 绿城郑州爱心公益网站平台源码+数据库+论文+部署文档

摘要 随着互联网技术的快速发展,公益事业逐渐从线下转向线上,数字化公益平台成为社会爱心传递的重要载体。绿城郑州爱心公益网站平台旨在通过信息化手段整合社会资源,为需要帮扶的群体提供更高效、透明的公益服务。该平台聚焦于解决传统公益活…

2026/5/17 5:41:21 阅读更多 →
Java Web HTML语言环保网站系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

Java Web HTML语言环保网站系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着全球环境问题日益严峻,环保意识的提升成为社会发展的关键议题。互联网技术的快速发展为环保宣传和教育提供了新的途径,构建一个功能完善的环保网站系统具有重要的现实意义。该系统旨在通过信息化手段普及环保知识,促进公众参与环保行…

2026/5/17 5:41:21 阅读更多 →
Java SpringBoot+Vue3+MyBatis 汽车维修预约服务系统系统源码|前后端分离+MySQL数据库

Java SpringBoot+Vue3+MyBatis 汽车维修预约服务系统系统源码|前后端分离+MySQL数据库

摘要 随着汽车保有量的持续增长,汽车维修服务的需求日益旺盛,传统的线下预约方式效率低下,难以满足用户对便捷性和实时性的需求。互联网技术的快速发展为汽车维修行业提供了新的解决方案,通过线上预约系统,用户可以随时…

2026/5/17 5:41:21 阅读更多 →

最新新闻

工业级条码扫描系统架构与核心技术解析

工业级条码扫描系统架构与核心技术解析

1. 工业级条码扫描系统架构解析LV30条码扫描器与MKV42F64VLH16微控制器的组合,构成了一个完整的工业级条码识别解决方案。这套系统在硬件设计上采用了模块化架构,主要包含三个核心部分:光学采集模块:LV30扫描器采用1/3英寸全局快门…

2026/7/6 7:13:06 阅读更多 →
STM32F439ZG驱动RGB灯带实现智能灯光控制系统

STM32F439ZG驱动RGB灯带实现智能灯光控制系统

1. 项目概述:用智能灯光打造沉浸式空间体验这个项目的核心目标是通过IN-PC55TBTRGB全彩LED灯带和STM32F439ZG高性能微控制器的组合,将普通空间转化为动态光影艺术装置。作为一名嵌入式开发工程师,我最近完成了这个智能灯光控制系统的完整实现…

2026/7/6 7:11:06 阅读更多 →
基于CEC1302与IN-PC55TBTRGB的环境光效系统设计

基于CEC1302与IN-PC55TBTRGB的环境光效系统设计

1. IN-PC55TBTRGB与CEC1302的硬件组合解析这个项目核心在于利用IN-PC55TBTRGB可编程RGB LED和CEC1302控制器,打造沉浸式环境照明系统。IN-PC55TBTRGB是Inolux推出的5x5mm可寻址RGB LED模块,采用串行移位寄存器设计,支持逐颗编程控制。实测单个…

2026/7/6 7:11:06 阅读更多 →
基于MC6470 IMU与dsPIC30F4011的运动控制系统设计

基于MC6470 IMU与dsPIC30F4011的运动控制系统设计

1. 项目背景与核心器件选型在工业自动化和机器人控制领域,精确的运动控制和位置感知一直是核心技术挑战。MC6470作为一款6自由度(6DOF)惯性测量单元(IMU),集成了三轴加速度计和三轴陀螺仪,能够提供高精度的运动追踪数据。而dsPIC30F4011是Mic…

2026/7/6 7:09:05 阅读更多 →
N_m3u8DL-RE流媒体下载:3个实用技巧轻松搞定在线视频保存

N_m3u8DL-RE流媒体下载:3个实用技巧轻松搞定在线视频保存

N_m3u8DL-RE流媒体下载:3个实用技巧轻松搞定在线视频保存 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE…

2026/7/6 7:07:05 阅读更多 →
基于74HC32与MKV44F64VLH16的智能键盘设计方案

基于74HC32与MKV44F64VLH16的智能键盘设计方案

1. 项目背景与核心需求在嵌入式系统开发中,按键输入是最基础也最频繁使用的人机交互方式之一。传统方案通常直接将机械按键连接到微控制器的GPIO引脚,但这种做法存在两个显著问题:一是按键抖动会导致误触发,二是占用宝贵的IO资源。…

2026/7/6 7:07:05 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻