2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

评论

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

软件测试/测试开发/全日制 | 前后端协同工作:Python全栈开发的团队合作实践

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

测试

中国电信天翼云全国产化大数据平台落地广西!

天翼云开发者社区

云计算 大数据 云平台

感恩有你|一起见证 OpenTiny 这5个锦鲤时刻

OpenTiny社区

开源 前端 低代码 组件库

软件测试/测试开发/全日制 | Python全栈开发中的前端工具与构建流程

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

测试

多策略深度智能分货拣货,助力快消品企业提升核心竞争力

用友BIP

你的数智化底座物尽其用了吗?

用友BIP

数智底座

软件测试/测试开发/全日制 | 从MySQL到MongoDB:Python全栈开发中的数据库选择

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

测试

强大防护:如何选择最佳美国高防服务器租用服务

一只扑棱蛾子

美国服务器 美国高防服务器

React Native 打包 App 发布 iOS 及加固混淆过程

软件测试/测试开发/全日制 | Python全栈开发中的消息队列应用

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

测试

软件测试/测试开发/全日制 | 前后端数据交互与Fetch API应用

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

测试

软件测试/测试开发/全日制 | Python全栈开发实战:构建完整的Web应用

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

测试

程序员真是越来越懒了,Api 文档都懒得写?程序员:Api工具惯的!

不在线第一只蜗牛

一文详解动态 Schema

Zilliz

数据库 Milvus shema

物联网与低代码: 连接人与数字世界的无限可能

不在线第一只蜗牛

低代码 物联网

效果图渲染角度哪什么小技巧?10个效果图渲染技巧

Renderbus瑞云渲染农场

云渲染 渲染农场 瑞云渲染 Renderbus云渲染农场 效果图渲染

软件测试/测试开发/全日制 | 从HTML到React:Python全栈开发中的前端框架应用

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

测试

CloudXR在农业领域的用例表现

3DCAT实时渲染

CLOUDXR 云化XR

软件测试/人工智能/全日制 | Python全栈开发:理解HTTPS加密机制与安全传输

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

测试

软件测试/测试开发/全日制 | 实现实时通信:Python全栈开发中的WebSocket实践

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

测试

软件测试/测试开发/全日制 | Python全栈开发:利用Docker实现应用容器化

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

测试

6本报告,助你2024招聘「才」源滚滚!

用友BIP

智能招聘

天翼云亮相操作系统大会&openEuler Summit 2023,斩获多项大奖!

天翼云开发者社区

云计算 大数据

ClkLog开源可视化埋点系统助你实现数据驱动运营!

ClkLog

如何将支持标准可观测性协议的中间件快速接入观测

观测云

可观测性 HBase

演讲实录|博睿数据副总裁杨雪松:可观测性建设之路(上)

博睿数据

征程万里,行则将至|博睿数据2023年度盘点

博睿数据

龙蜥操作系统上玩转铜锁密码库

OpenAnolis小助手

阿里云 操作系统 国密 龙蜥社区 铜锁

CSIG青年科学家会议圆满举行,合合信息打造智能文档处理融合研究新范式

合合技术团队

科技 大模型 合合信息 GPT-4

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