在我使用过的所有GUI库(Swing、Android、Windows Forms、WPF)中,都有一个黄金规则,即不能从另一个线程(非GUI线程)访问或修改GUI元素。我想这个规则适用于任何GUI库。违反此规则很可能导致应用程序崩溃。然而,最近我一直在思考,为什么会这样?我找不到任何深入的解释。那么,这个规则的低级解释是什么?
在我使用过的所有GUI库(Swing、Android、Windows Forms、WPF)中,都有一个黄金规则,即不能从另一个线程(非GUI线程)访问或修改GUI元素。我想这个规则适用于任何GUI库。违反此规则很可能导致应用程序崩溃。然而,最近我一直在思考,为什么会这样?我找不到任何深入的解释。那么,这个规则的低级解释是什么?
除非明确设计和构建为线程安全,否则没有任何软件是线程安全的。
图形用户界面(GUI)是一个复杂的有状态的系统,使其线程安全将是“代价高昂”的。
errno
线程安全的方法相同。话虽如此,我相信Qt和C#(以及可能还有其他语言)实际上支持一些跨线程操作。它们会执行一些(更或者更少)晦涩的魔法,将调用转发到GUI线程,并将结果再次转发回调用线程。换句话说,它们试图使必要的线程间通信对程序员更加方便,同时保留单线程GUI的效率和简洁性。这不仅限于GUI处理,而是一种通用方法,只是对GUI特别重要。