假设当程序在子线程中时,我想简单地更改Label的标题。我不想使用Synchronize。我真的不想让操作系统切换到另一个线程上下文来完成这项工作。我知道我不能通过在我的子线程中放一些锁(信号量或其他东西)来做到这一点。谁能告诉我为什么我不能使用锁的原因? 在此先感谢:)
答案 0 :(得分:4)
如果我们想在VCL主线程中进行一些更改,是否必须使用
Synchronize
?
是
那么,访问VCL对象的代码必须在主线程上执行,Synchronize
是实现它的最常用方法。没有办法解决这个限制。
答案 1 :(得分:1)
大卫的回答是100%正确的。但我以为我会更轻松一点......
想象一下这种情况:您有一个VCL组件,其中包含许多要从线程更新的属性。在尝试访问该对象及其属性时,您可以在主VCL线程和其他线程中创建锁(例如关键部分)和任何调用。但是,由于VCL不承认存在其他尝试使用它的线程,因此主线程中可能存在某些东西试图访问您的线程试图访问的相同属性... 同时时间。我不是在谈论你自己的代码可能访问这个属性,而是VCL背后的东西。 VCL自己不知道你的锁是否承认它。
因此,在主线程中处理任何内容时,即使最好的锁定机制也不安全。同步是多线程工作方式的重要组成部分,尽管有一些替代方案,例如提供窗口消息。
<强>方案强>
假设您创建了一个继承自TButton
的自定义按钮组件。您在此按钮后面创建一个线程,并希望从此线程中更新按钮的标题。您可以创建一个关键部分锁以保护您的控件。
我们还说你有一个行动经理,这个按钮被分配给一个动作。操作管理器负责更新按钮的标题。虽然您的线程和所有代码在访问按钮控件时都会遵守锁定,但操作管理器对此没有任何概念,并尝试继续更新标题。