问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么说GUI是单线程化的

发布网友 发布时间:2022-05-25 12:17

我来回答

2个回答

热心网友 时间:2023-10-26 20:48

  现代的gui框架使用了一个略微不同的模型:模型创建了一个专门的线程,事件派发线程(event dispatch thread,RDT)来处理gui事件。单线程化的GUI框架并不仅仅存在于java中:Qt、NextStep、Macos Cocoa、XWindows,等等都是单线程化的。也并不缺少反面的尝试;有很多试图写出多线程的GUI框架的努力,最终都由于竞争条件和死锁导致的稳定性问题,又回到了单线程化的事件队列模型的老路上来:采用一个专门的线程从队列中抽取事件,并把它们转发给应用程序定义的事件处理器。(awt最初曾尝试在某种程度上支持多线程访问,单线程化地实现swing的决定主要基于AWT中的经验和教训。)多线程的GUI框架会尤其易受死锁的影响,部分原因在于,输入事件处理与任何GUI组件背后的对象模型之间存在偶发的交互。用户发起的动作总会冒泡似的从操作系统传递给应用程序—先是由os检测到一次鼠标点击,然后工具集把它转化为“鼠标点击”事件,最终它会作为一个高层事件(比如“buttonpressed”事件)转发给应用程序的*。另一方面,应用程序发起的动作又会以冒泡的形式传回操作系统—应用程序发起一个动作要改变某个组件的背景颜色,这会被转发给一个特定的组件类,最终转发给os进行渲染。两种动作以完全相反的顺序访问相同的GUI对象,需要保证让每一个对象都是线程安全的,这会导致一系列的锁顺序的不一致,这会直接引发死锁。这个问题机会在每一次GUI工具集的开发中都会出现,是经验之谈。模型—视图—控制器(mvc)模式的普遍流行形成了导致多线程GUI框架出现死锁的另一原因。把用户的互交分拨到模型、视图和控制器之间的写作中,极大地简化了GUI应用程序的实现,但这让不一致的锁顺序再次雪上加霜。控制器调用模型,模型通知视图已经发生了一些事情。控制器同样可以调用视图,视图可以依次回调模型来查询模型的状态。结果是,不一致的锁顺序再次伴随死锁的风险一同到来。Graham hamilton,sun公司的vp,在他的weblog中详尽地概括了这些挑战,描述了多线程GUI工具集之所以会成为计算机科学史上又一次“失败的梦”。如果多线程GUI工具集经过非常谨慎的设计;如果工具集能使它加锁的方法鲜明地显露;如果你非常聪明,非常仔细,并且对工具集的整体框架有着全局的把握,我相信你还是可以成功地编写出多线程的GUI来。但是如果这些事情有一些轻微的偏差,程序多数时候仍然运行良好,但是你会偶尔看到程序挂起或者运行故障。那些密切参与了工具集设计的人能够很好地运用这种多线程方案。不幸的是,我认为这些特性并没有和商业流行度成正比。一个中等能力的程序员,整日构建着被一些莫名其妙的原因困扰着而不能稳定运行的应用程序,我们很容易落入这种境界。于是应该程序的作者会倍感怨恨与失落,对无辜的工具集恶语相加。单线程化的GUI框架通过现场*来达到现场安全性;所有GUI中的对象,包括可视组件和数据模型,都只是被事件线程访问。当然,这只把线程安全负担的一部分推给了应用程序的开发者,他们必须确保这些对象是被正确*的。

热心网友 时间:2023-10-26 20:49

现代的GUI框架使用了一个略微不同的模型:模型创建了一个专门的线程,事件派发线程(event dispatch thread,RDT)来处理GUI事件。单线程化的GUI框架并不仅仅存在于java中:Qt、NextStep、MacOS Cocoa、XWindows,等等都是单线程化的。也并不缺少反面的尝试;有很多试图写出多线程的GUI框架的努力,最终都由于竞争条件和死锁导致的稳定性问题,又回到了单线程化的事件队列模型的老路上来:采用一个专门的线程从队列中抽取事件,并把它们转发给应用程序定义的事件处理器。(AWT最初曾尝试在某种程度上支持多线程访问,单线程化地实现swing的决定主要基于AWT中的经验和教训。)多线程的GUI框架会尤其易受死锁的影响,部分原因在于,输入事件处理与任何GUI组件背后的对象模型之间存在偶发的交互。用户发起的动作总会冒泡似的从操作系统传递给应用程序—先是由OS检测到一次鼠标点击,然后工具集把它转化为“鼠标点击”事件,最终它会作为一个高层事件(比如“buttonpressed”事件)转发给应用程序的*。另一方面,应用程序发起的动作又会以冒泡的形式传回操作系统—应用程序发起一个动作要改变某个组件的背景颜色,这会被转发给一个特定的组件类,最终转发给OS进行渲染。两种动作以完全相反的顺序访问相同的GUI对象,需要保证让每一个对象都是线程安全的,这会导致一系列的锁顺序的不一致,这会直接引发死锁。这个问题机会在每一次GUI工具集的开发中都会出现,是经验之谈。模型—视图—控制器(MVC)模式的普遍流行形成了导致多线程GUI框架出现死锁的另一原因。把用户的互交分拨到模型、视图和控制器之间的写作中,极大地简化了GUI应用程序的实现,但这让不一致的锁顺序再次雪上加霜。控制器调用模型,模型通知视图已经发生了一些事情。控制器同样可以调用视图,视图可以依次回调模型来查询模型的状态。结果是,不一致的锁顺序再次伴随死锁的风险一同到来。Graham Hamilton,Sun公司的VP,在他的weblog中详尽地概括了这些挑战,描述了多线程GUI工具集之所以会成为计算机科学史上又一次“失败的梦”。如果多线程GUI工具集经过非常谨慎的设计;如果工具集能使它加锁的方法鲜明地显露;如果你非常聪明,非常仔细,并且对工具集的整体框架有着全局的把握,我相信你还是可以成功地编写出多线程的GUI来。但是如果这些事情有一些轻微的偏差,程序多数时候仍然运行良好,但是你会偶尔看到程序挂起或者运行故障。那些密切参与了工具集设计的人能够很好地运用这种多线程方案。不幸的是,我认为这些特性并没有和商业流行度成正比。一个中等能力的程序员,整日构建着被一些莫名其妙的原因困扰着而不能稳定运行的应用程序,我们很容易落入这种境界。于是应该程序的作者会倍感怨恨与失落,对无辜的工具集恶语相加。单线程化的GUI框架通过现场*来达到现场安全性;所有GUI中的对象,包括可视组件和数据模型,都只是被事件线程访问。当然,这只把线程安全负担的一部分推给了应用程序的开发者,他们必须确保这些对象是被正确*的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 海尔三开门变频冰箱有没有宽度小于580mm的? 我需要买个海尔的冰箱,但是尺寸受*,所以需要深度在580mm以内的,有哪位大师知道啊。急啊!!!! 海尔冰箱bcd一580wdgh有没有软冷冻功能 海尔冰箱bcd一580wbcrh制冷不理想为什么达不到冷冻温度 手撕面包中的甜老面指的是什么 Ps做图超过100mb就很卡是什么原因,电脑配置是Cpu9900k 显卡2060? 怎样用老面做面包吐司 我给理发师看这个图片理发师能明白不 侧面能剪出来不? 求,五月天 阿信 一张侧脸剪影的照片 面包的老面可以用什么代替 为什么生孩子要侧剪 刘海刚刚过眼,想剪侧分短发(类似下图),可以吗? PhotoShop如何将图片左侧裁剪780px,右侧裁剪195px 三星电池问题 二维码能辨别真假烟吗? 求助 模仿360读取本地相册的二维码!!! 用手机二维码扫—扫,在酒盒上二维码扫一下,可便认酒的真假,是真的吗? 中考试卷上贴的二维码,有人能仿造吗? 我玩红警2好卡哦?怎么回事啊 联通什么卡比较好 古风名字男有什么? 财务共享操作平台的培训目标是什么? 关于什么线程执行GUI更新的指南问题,怎么解决 牙膏的主要成分是 有人知道天津共享教育么,这个培训机构怎么样,我想报考教师资格证。 牙膏的成分?,,, 共享教育同线下培训机构怎么合作? 换轮胎难不难? 1.5g干燥剂的吸水量 一个女孩子自己可以换汽车备胎吗? pvc排水管可以直接埋地下吗 TCL P501M手机怎么截图? 力气小的女生怎么换汽车备胎? pvc20线管直接一袋多少个? 换轮胎有这么多讲究?90后美女,教你如何正确地换轮胎! 驰耐普汽车轮胎女司机自己换方便吗? 女生一个人怎么换车子备胎 PVC的等径直接和管箍是不是一样东西,有懂的麻烦帮我解答一下。在线等。 100m pvc管需要多少直接 企业响应号召居家办公,但是公司现有的IT环境不支持大规模远程办公,有什 ...