我知道您需要synchronize (yourprocedure)
来设置,例如标签的文字。
但是怎么样:
当我需要使用synchronize
?
PS。:同步类似于PostMessage / SendMessage吗?
答案 0 :(得分:10)
简单的经验法则:任何访问 VCL UI组件需要同步。这包括读取和写入UI控件属性。 Win32用户界面,最明显的对话框如MessageBox()
和TaskDialog()
,可以直接在工作线程中使用而无需同步。
TThread.Synchronize()
与SendMessage()
类似(事实上,它曾经在Delphi 5及更早版本的内部使用SendMessage()
实现)。 TThread.Queue()
与PostMessage()
类似。
答案 1 :(得分:4)
每次访问VCL UI组件时,都需要实现某种类型的线程安全措施。当您访问存在或将被另一个线程访问的变量或过程时,通常也是如此。但是,在所有这些情况下,您都不需要 来使用Synchronize方法。您可以使用其他工具,而Synchronize并不总是最佳解决方案。
在执行传递给它的过程时,同步阻塞主线程和调用线程,因此过度使用它会降低多线程的优势。同步可能是最常用于更新UI的,但如果您发现必须经常使用它,那么检查并查看是否可以重构代码可能不是一个坏主意。 I.E.你真的需要从你的线程中读取标签吗?你可以在启动线程之前读取标签并将其传递给线程的构造函数吗?你能在线程的OnTerminate事件处理程序中处理这些任务吗?