4

我知道您需要synchronize (yourprocedure)设置例如标签的文本。但是关于:

  1. 阅读标签的文本。
  2. 切换/设置标签的启用属性。
  3. 调用其他标签程序/函数(例如 onclick 事件)。

当我需要使用时,是否有一个简单的规则可以知道/记住synchronize

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

4

2 回答 2

10

简单的经验法则:任何VCL UI 组件的访问都需要同步。这包括读取和写入 UI 控件属性。 Win32 UI,尤其是像MessageBox()和之类的对话框TaskDialog(),可以直接在工作线程中使用而无需同步。

TThread.Synchronize()类似于(实际上,它曾经在 Delphi 5 及更早版本中 SendMessage()使用内部实现)。类似于。SendMessage()TThread.Queue()PostMessage()

于 2013-05-15T00:30:26.203 回答
4

每当您访问 VCL UI 组件时,您都需要实施某种类型的线程安全措施。通常,当您访问存在或将被另一个线程访问的变量或过程时,也会出现这种情况。但是,您不需要所有这些情况下都使用 Synchronize 方法。还有其他工具可供您使用,而 Synchronize 并不总是您的最佳解决方案。

Synchronize 在执行传递给它的过程时会阻塞主线程和调用线程,因此过度使用它会降低多线程的好处。Synchronize 可能最常用于更新您的 UI,但如果您发现您必须非常频繁地使用它,那么检查并查看您是否可以重组您的代码可能不是一个坏主意。IE 你真的需要从你的线程中读取标签吗?您可以在启动线程之前读取标签并将其传递给线程的构造函数吗?您可以在线程的 OnTerminate 事件处理程序中处理任何这些任务吗?

于 2013-05-15T06:19:19.407 回答