用户界面对象的线程亲缘性第二篇: 设备上下文

news/2024/10/20 11:47:20/

在上一篇文章中,我们简单地介绍了控制窗口句柄的线程亲缘性规则。
今天,我们来讲讲设备上下文(Device Context, 简称 DC) 。

设备上下文也有一定程度的线程亲缘性。调用 DC 相关函数,例如 GetDC 的线程,必须在同一个线程中调用其对应的 ReleaseDC。但和窗口句柄一样,在 DC 对象的生存期内,任何线程都可以访问它。

如果你希望以多线程方式使用 DC,则负责协调该设备上下文的使用者,以便一次只有一个线程使用它。

例如,若要跨多个线程承载无窗口控件,主机在主线程上获取 DC,然后按顺序要求每个控件将自身绘制到该 DC 中。一次只有一个控件绘制到 DC 中,即使该控件恰好位于不同的线程上也是如此。

DC 的线程亲缘性比窗口句柄的线程亲缘性要微妙得多,因为如果你搞砸并从错误的线程释放 DC,事情似乎仍然运行良好,但窗口管理器的内部资源记录表会一团糟,你可能会在稍后从 GetDC 获得一个无效的 DC 句柄,然后用户界面会呈现出你所不希望看到的样子,甚至会以应用程序的直接崩溃作为结局。

在下一篇文章中,我将介绍其他的用户界面元素的线程亲缘性,请拭目以待。

总结

复杂用户界面开发起来需要花费一些功夫,在开发拓扑梅尔智慧办公平台(Topomel Box)的过程中,我总是遵循一个简单的原则:仅在主界面线程中操控用户界面对象,工作线程只用来干“脏活累活”。
有了这个统一的规则,你会形成肌肉记忆:这个更新界面的代码应该放在哪里。
简单,是一种美。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Thread affinity of user interface objects, part 2: Device contexts》

 


http://www.ppmy.cn/news/61380.html

相关文章

PID整定二:基于Ziegler-Nichols的频域响应

PID整定二:基于Ziegler-Nichols的频域响应 1参考2连续Ziegler-Nichols方法的PID整定2.1整定方法2.2仿真示例 1参考 1.1根轨迹图的绘制及分析 1.2计算机控制技术01-3.4离散系统的根轨迹分析法 1.3PID控制算法学习笔记 2连续Ziegler-Nichols方法的PID整定 2.1整定…

leetcode:234.回文链表(详解)

前言:内容包括-题目,代码实现,大致思路,代码解读 题目: 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1&…

Java日志详解

文章目录 1.日志的概述1.1 日志文件1.1.1 调试日志1.1.2 系统日志 1.2 JAVA日志框架1.2.1 为什么要用日志框架1.2.2 日志框架和日志门面 2.JUL2.1 JUL简介2.2 JUL组件介绍2.3 JUL的基本使用2.3.1 日志输出的级别2.3.2 日志的输出方式2.3.3 自定义日志的级别2.3.4 将日志输出到具…

【产品方案】后台管理系统设计思路

第一章 前言 相比前端设计,我更喜欢设计后台管理系统。如果说前端设计考验的是共情能力,那后台管理系统设计考研的就是逻辑能力,前者需要站在用户的角度,后者是站在管理者的角度思考。 有幸参与了公司不少业务系统从“0-1”的设计…

Lerna

Lerna Lerna是一个优化基于gitnpm的多pagkage项目的管理工具 解决的痛点 痛点一:重复操作 多Package本地link多Package依赖安装多Package单元测试多Package代码提交多Package代码发布 痛点二:版本一致性 发布时版本一 致性发布后相互依赖版本升级 package越多,管…

6.1.1 图:基本概念

一,基本概念 1.基本定义 (1)图的定义 顶点集不可以是空集,但边集可以是空集。 (2) 有向图的表示: 圆括号 无向图的表示: 尖括号 简单图、多重图: 简单图:…

强化学习_06_pytorch-TD3实践(BipedalWalkerHardcore-v3)

基于策略的离线算法TD3 1.1 简介 reference: openai-TD3 DDPG的critic会高估, 从而导致actor策略失败。TD3是增加了三个关键技巧优化DDPG。经过优化后的TD3(Twin Dalayed DDPG 双延迟深度确定性策略梯度算法)适合于具有高维连续动作空间的任务。 Tricks: Clipped Double Q-l…

java调用cmd命令

1.首先,我们需要了解一下 java是如何调用 cmd的: 6.在实际的开发中,我们有可能会遇到 java调用 cmd命令的情况: 7.对于一些特定的环境下,例如在嵌入式系统中,那么我们可以使用下面这种方式来调用 cmd命令&a…