浅谈更糟糕的 CS_CLASSDC 标志位的作用

news2024/11/19 7:29:24

在上一篇文章中,我们了解了 CS_OWNDC 标志位的历史,也说明了设计它的初衷。
这个标志位一开始看起来是个挺好的设计,但是如果你多琢磨一会儿,就会发现它不是一个好主意。今天我们来看看更糟的。

CS_CLASSDC 标志位有点类似 CS_OWNDC ,但更糟糕的是,它把 CS_OWNDC 的所有问题都放大了。此话怎讲?

我们先回想一下,CS_OWNDC 标志指示窗口管理器为窗口创建 DC,并使用该单个 DC 来响应对 BeginPaint 和 GetDC 的调用。CS_CLASSDC 更进一步,为该类的所有窗口创建一个 DC。因此,我上次使用一个函数显示的问题,该函数认为它有一个窗口有两个不同的 DC,现在甚至可以跨窗口发声。你认为一个窗口有一个 DC,另一个窗口有另一个 DC,但实际上它们是相同的!

更糟糕的是,两个线程可以同时使用相同的 DC。GDI 中没有任何禁止它的内容;这只是一场竞赛,看看哪个线程的变化占上风:”最后一个界面绘制代码将会获胜”。
假设两个线程碰巧每个线程都有一个来自同一窗口类的 CS_CLASSDC 窗口,并假设两个窗口都需要重新绘制。每个窗口都会收到一条 WM_PAINT 消息,两个线程都进入其绘制代码。
但这些线程不知道的是它们在同一个 DC 上运行。

>> 请移步至 topomel.com 以查看图片 <<

在线程 A 中运行的代码完全期望文本为红色,因为它将文本颜色设置为红色,然后绘制文本。怎么知道就在那一刻,线程 B 去把它改成了蓝色?

这是一种竞争条件错误,你可能永远无法在受控条件下研究。你只会收到来自客户的错误报告,说也许每个月一次,一个项目的颜色错误,也许你自己偶尔会看到它,但当你设置了调试器断点时,它永远不会发生。即使添加其他诊断代码,也只会看到以下内容:

>> 请移步至 topomel.com 以查看图片 <<

太好了,断言被触发了。你刚刚设置的颜色不存在。现在你要做什么?也许你只会说“这不会是操作系统出了Bug吧?”并将你的代码更改为下图的代码:

>> 请移步至 topomel.com 以查看图片 <<

即使这样也不能解决问题,因为线程 B 可能在 GetTextColor 和调用 DrawText 后将颜色更改为蓝色。现在,每六个月只有一次,绘制的的颜色是错误的。

你向 Microsoft 发誓 ,发誓从现在开始开发 MAC 平台上的软件。

好的,所以现在我希望我已经说服你,CS_CLASSDC 是一个可怕的坏主意。但是,如果它有如此根本性的缺陷,为什么它会被设计出来?

因为 16 位 Windows 是协作式多任务的。在 16 位世界中,你不必担心另一个线程潜入并弄乱你的 DC,因为正如我已经指出的,你正在运行的事实意味着没有其他人在运行。这整个多线程灾难场景不会发生,因此 CS_CLASSDC 仅比 CS_OWNDC 稍微古怪。

在单个进程中引入具有多个线程的先发制人的多任务处理将我们带入了“这没有机会正常工作”的世界(这段话有点长,再读一次)。类样式的存在使得在 16 位代码中使用它的人可以移植到 Win32(只要他们承诺保持单线程应用程序),但现代软件不应该使用它。

总结

今天的总结是:CS_CLASSDC 咱哥几个是碰都不要碰,谁碰谁知道。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《What does the CS_CLASSDC class style do?》

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/898497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

shell脚本文本三剑客sed

shell脚本文本三剑客sed 一.Sed编辑器1.1sed概述1.2sed工作流程1.3sed基本法1.4sed常用选项1.5sed命令的常用操作 二.sed命令使用2.1打印内容2.2删除内容示例5&#xff1a;先备份内容在删除2.3插入内容2.4取反2.5搜索替代2.6分组调用 一.Sed编辑器 1.1sed概述 sed编辑器是一种…

Linux 虚拟机Ubuntu22.04版本通过远程连接连接不上,输入ifconfig只能看到127.0.0.1的解决办法

之前给虚拟机配置静态IP之后&#xff0c;可以直接通过主机Vscode远程连接。但是前一段时间把主机的TCP/IPV4静态IP设置了一下之后&#xff0c;再连接虚拟机就连不上了&#xff0c;于是参考解决虚拟机不能上网ifconfig只显示127.0.0.1的问题&#xff0c;又可以连接上了&#xff…

Python “贪吃蛇”游戏,在不断改进中学习pygame编程

目录 前言 改进过程一 增加提示信息 原版帮助摘要 pygame.draw pygame.font class Rect class Surface 改进过程二 增加显示得分 改进过程三 增加背景景乐 增加提示音效 音乐切换 静音切换 mixer.music.play 注意事项 原版帮助摘要 pygame.mixer pygame.mix…

SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程

首先&#xff0c;如果在某个类或某个方法被标记为Transactional时&#xff0c;Spring boot底层会在创建这个bean时生成代理对象&#xff08;默认使用cglib) 示例&#xff1a; 当调用studentService的addStudent方法时&#xff0c;会直接跳到CglibAopProxy类去执行intercept方…

vscode里配置C#环境并运行.cs文件

vscode是一款跨平台、轻量级、开源的IDE, 支持C、C、Java、C#、R、Python、Go、Nodejs等多种语言的开发和调试。下面介绍在vscode里配置C#环境。这里以配置.Net SDK v5.0&#xff0c;语言版本为C#9.0&#xff0c;对应的开发平台为VS2019&#xff0c;作为案例说明。 1、下载vsc…

vue3小知识点汇总——基础积累

下面的小知识点比较零散&#xff0c;但是脑子不太好使&#xff0c;只能先记录一下啦&#xff0c;后面知识丰富起来后&#xff0c;慢慢就懂了。 1.最新版node.js已经不兼容vue2的项目了&#xff0c;学习vue3势在必行 node.js的安装及vue的搭建详细步骤&#xff1a;http://t.cs…

比特币暴跌的4个原因

作者&#xff1a;秦晋 加密市场每隔一段时间&#xff0c;就会迎来一次「暴跌」&#xff0c;而且每次暴跌原因各不相同。但归根到底都是「恐慌情绪」在作怪。继「312暴跌」、「519暴跌」之后&#xff0c;又迎来一个「8.18暴跌」。相比前两次暴跌&#xff0c;此次暴跌的原因或许略…

想做赴日程序员 有一定技术经验不学日语可以赴日IT吗?

有的小伙伴问&#xff1a;我有一定的IT技术和经验&#xff0c;不学日语的话&#xff0c;能去做赴日IT工作吗&#xff1f;说实话啊&#xff0c;我感觉如果行的话&#xff0c;那只能说明你运气不错&#xff0c;因为日本的IT行业在日本来说&#xff0c;并不是非常高薪的行业&#…

Redis中的有序集合

前言 本文着重介绍Redis中的有序集合的底层实现中的跳表 有序集合 Sorted Set Redis中的Sorted Set 是一个有序的无重复值的集合&#xff0c;他底层是使用压缩列表和跳表实现的&#xff0c;和Java中的HashMap底层数据结构&#xff08;1.8&#xff09;链表红黑树异曲同工之妙…

【深入了解PyTorch】PyTorch实战项目示例:深入探索图像分类、目标检测和情感分析

【深入了解PyTorch】PyTorch实战项目示例:深入探索图像分类、目标检测和情感分析 PyTorch实战项目示例:深入探索图像分类、目标检测和情感分析项目一:图像分类数据集准备构建模型训练模型模型评估和预测项目二:目标检测数据集准备构建模型训练模型模型评估和预测项目三:情…

记录因暴露阿里最高权限的Accesskey和secretKey导致的反弹shell攻击过程

Accesskey和SecretKey的泄露的原因 说到这个最高权限的key的泄露&#xff0c;绝对是低级的设计导致的。为了减少服务端的压力&#xff0c;直接让app直连oss服务&#xff0c;而且把最高权限的Accesskey和secretKey 下发到客户端&#xff0c;那么结果就是只要安装了该app的人&am…

js判断用户当前网络状态和判断网速

前端判断用户当前网络状态和判断网速 一、第一种是通过 HTML5 提供的 navigator 去检测网络(1)、原理介绍:(2)、兼容性 二、监听window.ononline和window.onoffline事件:三、通过ajax进行请求判断(兼容性好-推荐)(1)、原理介绍:(2)、注意: 四、navigator.connection方法监听网络…

PP-TS基于启发式搜索和集成方法的时序预测模型,使预测更加准确

时间序列数据在各行业和领域中无处不在&#xff0c;如物联网传感器的测量结果、每小时的销售额业绩、金融领域的股票价格等等&#xff0c;都是时间序列数据的例子。时间序列预测就是运用历史的多维数据进行统计分析&#xff0c;推测出事物未来的发展趋势。 为加快企业智能化转型…

Vue elementui 实现表格selection的默认勾选,翻页记录勾选状态

需求&#xff1a;当弹出一个列表页数据&#xff0c;对其进行筛选选择。 列表更新&#xff0c;填充已选数据 主要使用toggleRowSelection 代码如下&#xff1a; <el-table v-loading"loading" :data"drugList" selection-change"handleSelection…

安卓手机跑 vins slam (1)

一直是手机拍照&#xff0c;用RealityCapture重建三维模型。因为他是靠特征点去把拍摄的多个图像进行对齐的。需要拍摄的足够多&#xff0c;且有特征才能对齐&#xff0c;要不然会生成多个组件&#xff0c;还得手动拼。 而且重建的三维模型有尺度问题&#xff0c;自动重建的模…

四、内存管理

1、为什么需要自己实现内存管理 (1)RTOS涉及的内核对象&#xff1a;task、queue、semaphores和event group等。为了让FreeRTOS更容 易使用&#xff0c;这些内核对象一般都是动态分配&#xff1a;用到时分配&#xff0c;不使用时释放。使用内存的动态管理功能&#xff0c;简化了…

使用yolov5进行安全帽检测填坑指南

参考项目 c​​​​​​​​​​​​​​GitHub - PeterH0323/Smart_Construction: Base on YOLOv5 Head Person Helmet Detection on Construction Sites&#xff0c;基于目标检测工地安全帽和禁入危险区域识别系统&#xff0c;&#x1f680;&#x1f606;附 YOLOv5 训练自己的…

Unity导入google.protobuf失败,无法找到google命名空间

问题&#xff1a; 1.刚开始把protobuf的文件夹直接从其他项目里(unity2021)里复制到unity(2020)版本&#xff0c;当时报错protobuf.dll的依赖项system.memory版本不对。 2.没有使用原来的protobuf文件了。使用vs2019的NuGet管理包来下载Google.Protobuf &#xff0c;仍然报错找…

爬虫学得好,然后呢?最新Python人工智能就业班课程

课程链接&#xff1a; 私信&#xff1a;达内 课程介绍&#xff1a; 【达内最新Python人工智能就业班课程目录】 &#x1f4da; 1. Python核心 &#x1f9e0; 2. 面向对象程序设计 &#x1f52e; 3. Python高级 &#x1f4bb; 4. 阶段项目实战 &#x1f427; 5. Linux操作系…

PHP海外代购管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 海外代购管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/88229435 论文 https://…