产品战略专家梁宁确认出席AICon北京站,分享AI时代下的商业逻辑与产品需求 了解详情
写点什么

使用 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:452684

评论

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

直呼内行,华为云桌面就是这么专业

IT科技苏辞

华为云数据库GaussDB(for MySQL)全方位守护企业云上数据安全

爱科技的水月

Elasticsearch查询及聚合类DSL语句宝典

京东科技开发者

数据库 存储 ES dsl 查询语句

单测在商家前端业务中的实践

得物技术

架构 前端 Web 测试 单元测试 12 月 PK 榜

使用 QuTrunk+Amazon ParallelCluster3 进行并行计算

亚马逊云科技 (Amazon Web Services)

亚马逊云科技 Hero 专栏

如何在 15 分钟内度量 DORA 指标?

思码逸研发效能

研发效能

这一篇让你彻底搞懂微信生态里的二维码

产品海豚湾

产品经理 产品设计 二维码 微信扫码 SaaS 产品

HTTP实体首部字段

穿过生命散发芬芳

HTTP 12月月更

AI技术赋能数智化转型,激发企业变革创新

用友BIP

架构实战营模块三作业

张贺

数据可视化软件有哪些?

优秀

数据可视化工具

架构实战营第10期模块3作业

Geek_4db2d5

丧心病狂,竟有Thread.sleep(0)这种神仙写法?

JAVA旭阳

Java JVM

【漏洞分析】Apache ShardingSphere-Proxy <5.3.0 身份认证绕过

墨菲安全

开源 安全漏洞 软件供应链安全

数字孪生赋能智慧港口解决方案,助力港口数字化转型

袋鼠云数栈

数字孪生

内卷时代,华为云引领移动办公新潮流

清欢科技

守护企业数据安全,华为云数据库 GaussDB(for MySQL)有绝招

科技之光

如何写一个深度学习编译器

MegEngineBot

深度学习 开源 编译器 MegEngine MegCC

MAXHUB+腾讯会议:为未来办公造一部动力引擎

脑极体

天猫联合瓴羊、贝恩,打造“产品致胜”的DTC发展模式

瓴羊企业智能服务

Mysql到TiDB迁移,双写数据库兜底方案

京东科技开发者

数据库 开源 开发 迁移 双写数据库

2022-12-27:etcd是无界面的,不好看,joinsunsoft/etcdv3-browser是etcd的web可视化工具之一。请问在k3s中部署,yaml如何写?

福大大架构师每日一题

云原生 k8s etcd k3s 福大大

【web 开发基础】PHP数组元素的添加和删除操作 (49)

迷彩

数组 数组操作 PHP基础 先进先出 后进先出

基于Redis实现DelayQueue延迟队列设计方案(附源码)

石臻臻的杂货铺

redis

阿里最新产:SpringCloud微服务架构进阶笔记(2023终极版)

程序员小毕

程序员 微服务 后端 架构师 java面试

「实操」结合图数据库、图算法、机器学习、GNN 实现一个推荐系统

NebulaGraph

推荐系统 图数据库 图算法 GNN

Content-Length使用不规范导致Socket Hang Up问题

Kevin Wu

TCP HTTP HttpClient content-length

云上数字化时代,华为云桌面助力政企办公升级

IT科技苏辞

华为云数据库助力微鲤科技智能升级

爱科技的水月

企业数据上云,华为云数据库 GaussDB(for MySQL)轻松解决

科技之光

Git使用教程之本地仓库的基本操作

梦笔生花

git git 学习 Git命令行

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