用户界面对象的线程亲缘性第一篇: 窗口

news2024/11/29 0:31:05

不同的对象具有不同的线程亲缘性规则,但其基本原则来自古老的 16 位 Windows。

在 Windows 系统上,最重要的用户界面对象当然是窗口了。窗口对象有它自己的线程亲缘性。创建窗口的线程是与窗口具有不可分割关系的线程。非正式地说,线程”拥有”它所创建的窗口。消息仅在拥有它的线程上调度到窗口过程,一般来说,对窗口的修改应仅从拥有它的线程进行。

尽管窗口管理器允许任何线程访问窗口属性、样式和其他属性(如窗口过程),并且从窗口管理器的角度来看,此类访问是线程安全的,但加载-修改-写入序列通常应限制为窗口的所有者线程。否则,你会遇到如下图所示的竞争条件。

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

如果从任何线程不小心修改窗口过程,则在前两行之间,第二个线程可能会更改窗口的窗口过程,从而导致 newWndProc 将错误的”上一个”窗口过程传递给 CallWindowProc。

那么,为什么 Windows 甚至允许非所有者线程首先更改窗口过程呢?

因为,众所周知,16 位 Windows 是一个协作式多任务系统,这意味着一个线程可以安全地做任何它想做的事情,因为知道没有其他线程会中断它,直到它明确放弃对CPU的控制。因此,上述代码在 16 位 Windows 中是安全的。出于兼容性原因,代码仍然是合法的,即使它不再安全。

(但是请注意,为了限制安全风险的影响范围,窗口管理器只允许拥有窗口的进程中的线程更改窗口过程。这是一个合理的限制,因为单独的地址空间意味着其他进程中的函数地址在拥有窗口的进程中毫无意义。)

总结

在 拓扑梅尔智慧办公平台 (Topomel Box) 的开发中,我始终坚守的一个编码规则是:仅在主线程中进行用户界面有关的修改,决不能在工作线程中做这种事,所有的修改要求都通过 Windows 消息来通知主线程。
对我而言,这是一个很有用的规则,一是它是简洁而不用思索的(所有的情况都直接套用这一规则,不必纠结),而是这篇文章中所提到的线程亲缘性规则。

最后

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

 

 

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

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

相关文章

Pytorch激活函数最全汇总

为了更清晰地学习Pytorch中的激活函数&#xff0c;并对比它们之间的不同&#xff0c;这里对最新版本的Pytorch中的激活函数进行了汇总&#xff0c;主要介绍激活函数的公式、图像以及使用方法&#xff0c;具体细节可查看官方文档。 目录 1、ELU 2、Hardshrink 3、Hardsigmoid…

分屏视图上线,详情数据秒切换

分屏视图 路径 表单 >> 表单设计 功能简介 新增「分屏视图」。分屏视图是一种对数据阅读提供沉浸式体验的视图组织形式&#xff0c;用户可通过分屏视图更快速的查看数据详情。 使用场景&#xff1a; 对于数据类型是「订单」数据的表单&#xff0c;管理人员往往会对…

pandas的使用

Pandas 的使用 **介绍:**pandas 是 python 语言的的一个关于数据分析的扩展库&#xff1b;pandas 可以对各种数据进行操作, pandas 依赖于 numpy &#xff0c;在常规的数据分析中&#xff0c;pandas 的使用范围是最宽广的; 参考文章:https://www.runoob.com/pandas/pandas-tu…

VScode安装问题

1、编译运行的时候会产生正在启动生成… D:\install\vscode\vscode&MinGW\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gcc.exe -fdiagnostics-coloralways -g D:\install\vscode\Folder\hello.c -o D:\install\vscode\Folder\hello.exe ‘D:\install\vscode\…

服务端实时推送技术之SSE(Server-Send Events)

文章目录 前言一、解决方案&#xff1a;1、传统实时处理方案&#xff1a;2、HTML5 标准引入的实时处理方案&#xff1a;3、第三方推送&#xff1a; 二、SSE&#xff1a;1、客户端&#xff1a;2、服务端&#xff1a; 三、业务实践&#xff1a;总结&#xff1a; 前言 服务端推送…

JavaWeb之过滤器Filter

今天开发遇到了&#xff0c;简单记录一下&#xff01; 简介&#xff1a;Filter是JavaWeb三大组件之一&#xff08;Servlet程序、Listener监听器、Filter过滤器&#xff09; 作用&#xff1a;既可以对请求进行拦截&#xff0c;也可以对响应进行处理。 1、Filter中的三个方法 …

人类 vs AI:玩梗大作战,看看谁是最后的赢家?

能解释人类玩梗的 AI 究竟能多大程度地理解人类的「梗」&#xff1f; 五一假期就在眼前&#xff0c;LigaAI 小编每天都在「调休好烦」和「快放假啦」两种情绪间反复横跳&#xff0c;还会忍不住思考「AI 能不能理解调休和放假的情绪差异&#xff1f;」&#xff08;一些精神世界高…

xilinx block design address editor 计算

xilinx block design address editor 计算 1k 0x000 ~ 0x3ff 10bit 1m 00000 ~ FFFFF 20bit 每个pcie 配置空间有4k 【11:0】 PCIe 配置空间 (PCIe Configuration Space) PCIe Spec中定义&#xff1a;每个PCIe Function都有 4096 Byte 的配置空间(Configuration Space)。前256…

基于机器学习的纠错系统技术 - 智能文本纠错 API

引言 在过去的几十年里&#xff0c;文本纠错技术已经取得了巨大的进展&#xff0c;从最初的基于规则的纠错系统到现在的基于机器学习的纠错系统&#xff0c;技术的发展已经帮助人们解决了大量的文本纠错问题&#xff0c;随着机器学习技术的发展&#xff0c;文本纠错技术也发生…

WINCC 趋势判断

项目函数 //状态: //稳定 2 //稳定 //递增 -1 //无序 0 //波动 //递减 1 int ordered(double *Trend_data, int Trend_len) {int Trend_out 0,Order 0;if (Trend_len 1){return 2;}Trend_out (Trend_data[0] < Trend_data[1]) - (Trend_data[0] > Trend_da…

input 各类事件汇总触发时机触发顺序

今天梳理了一下input框的各类事件&#xff0c;简单介绍一下吧 目录 1.click 2.focus 3.blur 4.change 5.input 6.keydown 7.keyup 8.select 1.click 点击事件&#xff0c;简单易理解&#xff0c;点击触发&#xff0c;等下跟focus事件一起比较 2.focus 获取焦点事件…

新能源行业雨水除铊,污水中铊超标的解决方法

锂电行业的发展会带动相关产业的发展&#xff0c;例如锂电池原材料和生产设备的制造、电池回收和处理等&#xff0c;这些产业的发展可能也会带来铊排放问题。除了锂电池生产过程中可能存在的铊污染外&#xff0c;企业的生活污水也可能含有铊&#xff0c;因为铊是一种广泛存在于…

Java面试题总结 | Java面试题总结6-MYSQL模块(持续更新)

Mysql 文章目录 Mysql关系型数据库和非关系型数据库的区别什么是ORM?-**mybatis**如何评估一个索引创建的是否合理&#xff1f;Count函数执行效果上&#xff1a;执行效率上&#xff1a;count(主键)和count(列名) 数据库的三大范式Mysql中char和varchar的区别数据库设计或者功能…

【科普知识】电机的10种工作制说明:S1~S10

如今&#xff0c;在我们的生活中&#xff0c;电机几乎无处不在&#xff0c;从国防、工农、运输、临床器械、通讯到生活中的洗衣机、风扇、吸尘器、电动机器人等&#xff0c;都在应用着各式各样的电动机。 电机作为一种能够将电能转换成机械能的装置&#xff0c;是现代工业生产和…

Elisp之检测函数运行时,在它之前执行别的程序(六)

公众号&#xff1a;Android系统攻城狮 简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&am…

OpenGLES 实验室之2D篇 第三弹 の 直播白板

本文字数&#xff1a;4555字 预计阅读时间&#xff1a;12分钟 笔者之前发表的音视频文章&#xff0c;有图像的处理&#xff0c;音频的重采样等等&#xff0c;都属于入门级别。通过阅读它们&#xff0c;读者能对音视频有了了解。可在 Gitee 上面回顾。 2023 年&#xff0c;笔者将…

如何使用depcheck检查vue和react的依赖,以后不用把时间浪费在依赖问题上了

当我们在开发 JavaScript 项目时&#xff0c;会引入各种依赖库。但是有些依赖库可能只用到了部分功能&#xff0c;或者已经不再需要了&#xff0c;但是却一直被保留在项目中。 这些未使用的依赖库会占据项目的空间&#xff0c;增加项目的复杂度&#xff0c;影响项目的性能。为…

Elasticsearch --- 索引库、文档操作

一、索引库操作 索引库就类似数据库表&#xff0c;mapping映射就类似表的结构。 我们要向es中存储数据&#xff0c;必须先创建“库”和“表”。 1.1、mapping映射属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a;字段数据…

【python】scikit-learn包:机器学习

环境配置&#xff1a;Scikit-learn包 只支持python语言 安装 WinR &#xff0c;输入指令&#xff1a;pip install -U scikit-learn 数据预处理 数据导入 借助pandas和numpy 进行数据导入与处理 字符串类label的数字化编码 机器学习的函数大部分只能对数字信息进行处理&…

轻量级任务看板做任务管理

利用看板管理工作和任务&#xff0c;可以让团队更高效&#xff0c;也可以一目了然的了解任务进度及问题 1、首先创建一个任务看板 使用看板工具轻量级项目模板创建一个任务看板。 任务看板内包含&#xff1a;列表和任务卡片&#xff0c;列表一般代表任务流程及状态&#xff…