【发布时间】:2014-05-30 10:30:16
【问题描述】:
我在主窗体(线程)中有一个 TListView,还有许多其他线程使用 Synchronize 方法从列表中添加/删除项目。但是主线程也有一个修改列表项的方法,我希望该方法不会被其他想要在主线程中执行代码的线程中断。这可能吗?
【问题讨论】:
-
只有让主线程被中断才能被中断。你这样做吗?
标签: multithreading delphi
我在主窗体(线程)中有一个 TListView,还有许多其他线程使用 Synchronize 方法从列表中添加/删除项目。但是主线程也有一个修改列表项的方法,我希望该方法不会被其他想要在主线程中执行代码的线程中断。这可能吗?
【问题讨论】:
标签: multithreading delphi
您是否有证据表明您担心的事情正在发生?你不应该,因为它不可能发生。这就是Synchronize 的用途。主线程中执行的方法必须先完成,然后主线程才能为消息队列提供服务,以处理从工作线程通过Synchronize 分派的工作项,因此您无需担心。
当工作线程使用Synchronize 时,它实际上只是向主线程发送一条消息,告诉它它有工作要做。如果主线程忙于执行另一个方法,那么工作线程将简单地阻塞,直到主线程完成,随后处理消息队列,拿起工作项,执行它,然后向工作线程发回工作完成(让工作线程空闲然后继续)。
当然,这是假设您的主线程中的方法不调用Application.ProcessMessages() 或CheckSynchronize()(或者您正在使用一个棘手的组件来执行此操作,或类似的东西,没有你知道 -> 见:Delphi 7, Windows 7, event handler, re-entrent code)
【讨论】:
Application.ProcessMessages 会导致问题,因为它明确指示主线程在继续它已经在做的工作之前检查工作(并做它)。如果你不打电话给ProcessMessages,你很好。