写点什么

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

评论

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

C++如何拿到线程池的返回值

linux大本营

线程池 C++

分析nginx访问日志,统计前10的ip

linux大本营

nginx 日志

用户痛点与根因识别:解锁企业数字化转型成功的关键

L3C老司机

连续3天3场分享,KubeVela@KubeCon EU 2023 抢鲜看!

阿里巴巴云原生

阿里云 开源 云原生 KubeVela

lwip_recv_tcp阻塞读取数据代码

linux大本营

TCP 阻塞队列

什么是全民开发?|概念、技能和优势

草料二维码

低代码 无代码

云原生时代,不可不知的基础设施即代码(IaC)

极狐GitLab

DevOps 云原生 CI/CD gitops IaC

c语言实现timer的10个技术点

linux大本营

进程 定时器, Timer 文件描述符

阿里云张献涛:云原生计算基础设施助力汽车行业数字化升级

云布道师

云计算

xnginx在安全网关的应用场景

linux大本营

openresty 网关 web服务器

OceanBase 4.1解读:我们想给用户一个开箱即用的OceanBase部署运维工具

OceanBase 数据库

数据库 oceanbase

FastAPI 快速开发 Web API 项目: 通过 SQLAlchemy 进行数据操作

宇宙之一粟

Python sqlalchemy FastApi 三周年连更

PageObject设计模式

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

测试

Java EE应用服务器的事务管理

mazhen

Java transaction JavaEE

火山引擎边缘云,助力业务敏捷创新

火山引擎边缘云

CDN 边缘计算 火山引擎 边缘云

程序踩内存后,应该怎么排查

linux大本营

进程 内存管理 内存泄漏 C++

一键生成通用的web服务(gin)完整项目代码,开发效率至少提升2倍

vison

golang Web gin框架 代码自动生成

火山引擎云原生数据仓库ByteHouse技术白皮书V1.0 (Ⅳ)

字节跳动数据平台

数据导入 实时数据 实时导入 企业号 4 月 PK 榜

网络工程师经常搞混的路由策略和策略路由,两者到底有啥区别?

wljslmz

三周年连更

MobTech 秒验|守护账户安全

MobTech袤博科技

中国年轻人阅读洞察2023

易观分析

年轻人 阅读

WebIntents 翻身战,操作系统实现无缝集成的王牌

鼎道智联

AI

算法题每日一练:组合总和 II

知心宝贝

数据结构 算法 前端 后端 三周年连更

io_uring的10个技术点

linux大本营

高并发 异步 零拷贝 io_uring

Go HTTP 调用

陈明勇

Go golang HTTP 三周年连更

火山引擎 DataLeap 下 Notebook 系列文章二:技术路线解析

字节跳动数据平台

数据治理 数据研发 企业号 4 月 PK 榜

C++实现消息队列

linux大本营

C++ 消息列队

舒明:稳定支撑日高峰亿级保单交易,国泰产险的运维创新实践

OceanBase 数据库

数据库 oceanbase

怎么用systemd进行进程守护

linux大本营

Linux 进程 守护进程

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