写点什么

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

评论

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

同盾科技 x TiDB丨实时数据架构为风控智能决策保驾护航

PingCAP

#TiDB

企业专用的即时通讯产品如何选择?

BeeWorks

好家伙!阿里最新SpringBoot进阶笔记涵盖了SpringBoot所有骚操作

程序员小毕

程序员 后端 ssm springboot java面试

CMD有哪些有趣的命令?

Jackpop

软件测试 | 测试开发 | 相比Selenium,Web自动化测试框架Playwright

测吧(北京)科技有限公司

测试

云渲染动画价格一般多少?

Renderbus瑞云渲染农场

云渲染 云渲染价格

Apipost接口自动化测试功能详解

测试人生路

Postman 自动化测试 接口自动化测试

性能测试技术笔记(三):如何设计一个压测平台

老张

性能测试 压测平台

TiDB 6.5 LTS 发版

PingCAP

#TiDB

Github上有什么好的unity开源项目?

Jackpop

科技创新实力受认可,网易有道入选 2022 中国技术品牌影响力企业榜

有道技术团队

技术 数据分析

阿里云张献涛:无影,让计算触手可及

云布道师

无影云电脑

Python专属搜索引擎!又一款Python库学习神器?

Jackpop

连续四年发布科技趋势预测,他们在探索中国科技的“主干道”

脑极体

创作技术博客以来的一些成就

嵌入式视觉

知乎 博客 CSDN 博客园

EditText(输入框)详解

芯动大师

android edittext 输入框设计 文本框(TextView)

推动GameFi走向新叙事的Smart Finance,成为火必投票竞选项目

股市老人

干掉 “重复代码”,这三种方式绝了!

风铃架构日知录

Java 程序员 码农 工程师 代码

Java学习者看过来!这些优质项目千万别错过

Jackpop

Smart Finance成为火必投票竞选项目,参与投票获海量奖励

鳄鱼视界

数字人民币创新浪潮来袭,支付机构如何“乘风破浪”?

易观分析

金融 数字人民币 数字支付

2022 OpenMLDB 硕果累累,颁奖台上荣耀连连

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

WorkPlus平台多业务系统集成,让企业沟通协作更畅通

BeeWorks

Flutter Hero 动画组件的飞行过程显示控制

岛上码农

flutter ios 安卓 移动端开发 跨平台开发

一加11:新的赛场,“不温和”的答卷

脑极体

Git遇到冲突?解决也太简单了!

Jackpop

Kyligence 客户案例“泰康集团精细化经营分析与运营平台”获评数据智能最佳实践案例

Kyligence

数据分析 指标管理

Apipost——让前端、后端、测试共用一份API文档!

不想敲代码

8.3K Star!这才是我们苦苦寻找的PDF阅读器。。。

Jackpop

2023-01-06:给定一个只由小写字母组成的字符串str,长度为N, 给定一个只由0、1组成的数组arr,长度为N, arr[i] == 0表示str中i位置的字符不许修改, arr[i] ==

福大大架构师每日一题

算法 rust Solidity 福大大

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