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

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

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

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

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

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

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

总结

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

责任编辑:武晓燕 来源: 今日头条
相关推荐

2017-05-11 14:00:02

Flask请求上下文应用上下文

2022-09-14 13:13:51

JavaScript上下文

2012-12-31 10:01:34

SELinuxSELinux安全

2022-09-15 08:01:14

继承基础设施基础服务

2023-07-11 10:02:23

2023-01-14 22:49:44

Flask线程请求

2024-03-14 08:11:45

模型RoPELlama

2022-04-24 15:37:26

LinuxCPU

2020-07-24 10:00:00

JavaScript执行上下文前端

2021-07-26 07:47:36

Cpu上下文进程

2024-09-30 14:10:00

2017-12-17 17:01:23

限界上下文系统模型

2022-10-28 16:24:33

Context上下文鸿蒙

2024-11-06 12:59:42

多线程销毁线程切换

2009-12-29 09:15:00

2021-09-07 09:53:42

JavaScript变量提升

2017-06-27 18:52:05

TensorFlow深度学习

2024-08-27 09:46:39

Go协程效率

2012-07-18 11:39:18

ibmdw

2022-09-26 23:36:33

Linux系统CPU
点赞
收藏

51CTO技术栈公众号