【问题标题】:How to block other threads to use Synchronize if the main thread is not idle?如果主线程不空闲,如何阻止其他线程使用 Synchronize?
【发布时间】:2014-05-30 10:30:16
【问题描述】:

我在主窗体(线程)中有一个 TListView,还有许多其他线程使用 Synchronize 方法从列表中添加/删除项目。但是主线程也有一个修改列表项的方法,我希望该方法不会被其他想要在主线程中执行代码的线程中断。这可能吗?

【问题讨论】:

  • 只有让主线程被中断才能被中断。你这样做吗?

标签: multithreading delphi


【解决方案1】:

您是否有证据表明您担心的事情正在发生?你不应该,因为它不可能发生。这就是Synchronize 的用途。主线程中执行的方法必须先完成,然后主线程才能为消息队列提供服务,以处理从工作线程通过Synchronize 分派的工作项,因此您无需担心。

当工作线程使用Synchronize 时,它实际上只是向主线程发送一条消息,告诉它它有工作要做。如果主线程忙于执行另一个方法,那么工作线程将简单地阻塞,直到主线程完成,随后处理消息队列,拿起工作项,执行它,然后向工作线程发回工作完成(让工作线程空闲然后继续)。

当然,这是假设您的主线程中的方法调用Application.ProcessMessages()CheckSynchronize()(或者您正在使用一个棘手的组件来执行此操作,或类似的东西,没有你知道 -> 见:Delphi 7, Windows 7, event handler, re-entrent code)

【讨论】:

  • 那么,你是说当工作线程调用Synchronize时,只有当主线程完成它正在做的事情时,该代码才会在主线程中执行?
  • 主线程或多或少只是在等待消息并处理它。 Delphi 中的任何表单事件都只是为了响应处理消息而被调用。搞砸这些事情的一个简单方法是在这样的事件中调用 Application.ProcessMessages,因此应该避免或更好地禁止它。
  • @marusnebunu 是的。主线程一次只能做一件事。如果它正在执行您的方法,那么它也不能检查告诉它线程有工作要做的消息。它在当前工作完成时执行此操作(这就是为什么它被称为消息循环 - 检查工作? -> 工作 -> 检查工作? -> 工作 -> 等)。 Application.ProcessMessages 会导致问题,因为它明确指示主线程在继续它已经在做的工作之前检查工作(并做它)。如果你不打电话给ProcessMessages,你很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多