我什么时候需要在TThread中同步?

时间:2013-05-15 00:26:13

标签: multithreading delphi tthread

我知道您需要synchronize (yourprocedure)来设置,例如标签的文字。 但是怎么样:

  1. 阅读标签的文字。
  2. 切换/设置标签的已启用属性。
  3. 调用其他标签程序/功能(例如onclick事件)。
  4. 当我需要使用synchronize

    时,是否有一条易于理解/记住的规则?

    PS。:同步类似于PostMessage / SendMessage吗?

2 个答案:

答案 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事件处理程序中处理这些任务吗?