AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

使用 C++/CX 开发 Windows Store 应用程序的注意事项

  • 2012-11-02
  • 本文字数:1162 字

    阅读完需:约 4 分钟

《Diving deep into C++ /CX and WinRT》演讲里,Marian Luparu 谈到针对Windows 8 的应用程序的异常处理和性能问题。对于开发者来说,最重要的东西是理解WinRT 和标准C++ 代码之间的边界如何影响异常处理和性能。

异常处理基础

WinRT 没有异常的概念,它的内部使用 HResult。放在 Platform::Exception 的派生类之内的调试信息不会跨越 ABI 边界。通常和异常相关的信息只对调试器可用。

C++ 和 SEH 风格的异常会在跨越 ABI 边界的时候中止进程。这意味着所有 C++ 异常都需要处理,即使这意味着只是把它包装到 Platform::Exception 里。

在捕获 COMException 时一定要检查 HResult。如果你不知道如何处理某个 HResult,可以重新抛出这个异常。类似的,如果你调用一个 COM 方法,它返回一个错误代码,你应该马上把它转换成一个 Exception。

异步和异常处理

在使用并行模式库(PPL)时,让 Lambda 表达式接受一个 task 对象而不是一个单纯的结果是很重要的。比如说,应该使用

复制代码
.then( [](Task<int></int> result) {…} )

而不是

复制代码
.then( [](int result) {…} )

如果你使用第二个版本,一旦遇到异常,整个“then”代码块就会被忽略。(译注:关于 PPL 的异步可以参考《遇见PPL:C++ 的并行和异步》的第四节《async + continuation》)

异步和线程

和C#以及VB 里的async/await 一样,PPL 在处理线程时有点繁琐。如果你在UI 线程里开始一项操作,那么每个continuation(即“then”代码块)也将在UI 线程里执行。如果你想使用线程池,你需要向“then”方法传递 task_continuation_context::use_arbitrary 参数。

C++ 类 vs WinRT 类

一般而言,开发者不应该适用 WinRT 风格的类(ref class),除非他们要和 XAML 交互或者向其他语言提供 WinRT 组件而不得不这样做。WinRT 类比标准 C++ 类慢,而且不能移植,即无法在标准 C++ 应用程序里使用。

另一个改善性能的途径是减少 WinRT 类型和 C++ 类型之间的转换。虽然频繁的跨越 WinRT 边界的通讯会很慢,但没有必要的分配内存和复制数据可能更糟。

一些诸如 StringReference 的包装类或许能够缓解性能问题,但使用的时候必须非常小心。StringReference 是引用计数的,因此,在 StringReference 释放之前,它包装的缓冲内容不能被改变或者删除。这个问题会在 WinRT 持有 StringReference 的一个副本时出现,你无法预料会出现什么结果。Marian Luparu 给出了一个例子:

  1. 创建 StringReference 包装一个缓冲内容。
  2. 调用一个 WinRT 函数并传递这个 StringReference。
  3. 这个 WinRT 函数触发一个 C++ 回调。
  4. 这个回调修改底层的缓冲内容。
  5. 控制权回到 WinRT 函数,但字符串已被意外地修改了。

ArrayReference 也能类似的用来包装 C++ 数组。但由于 WinRT 并不期望 C++ 数组是不可变的,于是出现问题的机会比较少。

查看英文原文: Notes on Writing a Windows Store Apps with C++/CX

2012-11-02 03:452908

评论

发布
暂无评论
发现更多内容

开源家装小程序

源字节1号

开源 软件开发 前端开发 后端开发 小程序发开

【涨知识】PCB板为什么多是绿色的?

华秋PCB

PCB PCB电路板 电路板 PCB设计 显影

长三角生物医药产业加速跑,飞桨螺旋桨为创新药企、医药技术伙伴装上AI大模型引擎

飞桨PaddlePaddle

飞桨 科学计算 飞桨螺旋桨 文心生物计算大模型

天翼云“息壤”荣膺第六届数字中国建设峰会“十大硬核科技”称号

天翼云开发者社区

云计算 算力 超算

基于 TiDB + Flink 实现的滑动窗口实时累计指标算法

PingCAP

MySQL 数据库 开源 分布式 TiDB

Shell脚本中的echo命令

芯动大师

echo Shell命令 三周年连更

飞书深诺电商广告素材搜索实战

飞书深诺技术团队

向量检索 Milvus 以图搜图

开源赋能 普惠未来|统信软件寄语2023开放原子全球开源峰会

开放原子开源基金会

深入解析PHP代码审计技术与实战【网络安全】

网络安全学海

编程 网络安全 信息安全 渗透测试 WEB安全

PostgreSQL-HA 高可用集群在 Rainbond 上的部署方案

北京好雨科技有限公司

postgresql Kubernetes 云原生 rainbond 企业号 5 月 PK 榜

直播预告 | 博睿学院:全面升级自适应AIOps

博睿数据

可观测性 AIOPS 智能运维 博睿数据 博睿学院

一文读懂 DNS 解析

火山引擎边缘云

DNS 域名解析 火山引擎 边缘云

二层交换机和三层交换机到底区别在哪?

wljslmz

交换机 三周年连更

大咖说丨云计算:数字世界的“中枢神经”

天翼云开发者社区

云计算

解决Centos7 yum 出现could not retrieve mirrorlist 错误

北桥苏

Centos 7 linux\

数据不只是数字:描述、分析、展示呈现数据的故事

Data 探险实验室

数据分析 数据 数据可视化 数字 可视化分析

急吗?光急可没用呀!满满干货,两小时速成,别搁那干瞪眼了!

加入高科技仿生人

低代码 数字化 OA 数字转型

解决nginx配置负载均衡时invalid host in upstream报错

北桥苏

nginx

Django笔记二十四之数据库函数之比较和转换函数

Hunter熊

Python MySQL django cast

「MIAOYUN」:降本增效,赋能传统企业数字化云原生转型 | 36kr 项目精选

MIAOYUN

云原生 数字化转型 智能运维 降本增效 36氪

滋灌中小企业,分销伙伴和华为来做“送水人”

脑极体

分销

RDMA网络实践

天翼云开发者社区

云计算 存储 RDMA

为什么ChatGPT用强化学习而非监督学习?

OneFlow

小度搭载AI技术进军手机市场:AI技术会是手机市场的一剂强心针吗

石头IT视角

今日分享丨5分钟快速了解Containerd

inBuilder低代码平台

云原生

今天开讲,6 大演讲主题、5 位技术大咖!龙蜥大讲堂 5 月精彩直播预告抢先看

OpenAnolis小助手

开源 操作系统 内核 龙蜥社区 龙蜥大讲堂

OpenVINO: 一款全面的深度学习应用程序优化工具

IT蜗壳-Tango

三周年连更

linux上SVN出现 "Unable to connect to a repository at URL 'svn://xx.xx.xx.xx/xxx' 和 No repository ...

北桥苏

svn linux\

C++异常和错误处理机制:如何使您的程序更加稳定和可靠

小万哥

c++ 程序员 面试 后端 开发

QUIC协议在天翼云CDN全站加速产品中的应用

天翼云开发者社区

云计算 QUIC

解决easyswoole的swServer_start_check: onTask event callback must be set at报错

北桥苏

php swoole

使用C++/CX开发Windows Store应用程序的注意事项_C++_Jonathan Allen_InfoQ精选文章