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