我在主Form(Thread)中有一个TListView,还有许多其他线程使用Synchronize方法从列表中添加/删除项目。但主线程还有一个修改列表项的方法,我希望该方法不被其他想要在主线程中执行代码的线程中断。这可能吗?
答案 0 :(得分:4)
你有证据表明你担心的事情正在发生吗?你不应该,因为它不可能发生。这就是Synchronize
的用途。在主线程中执行的方法必须在主线程可以为消息队列提供服务之前完成,以处理从工作线程通过Synchronize
调度的工作项,这样您就不用担心了。
当工作线程使用Synchronize
时,它基本上只是向主线程发布一条消息,告诉它它有效。如果主线程忙于执行另一个方法,则工作线程将直接阻塞直到主线程完成,随后处理消息队列,拾取工作项,执行它,然后回发给工作线程,工作是完成(让工作线程自由然后继续)。
当然,假设主线程中的方法是而不是调用Application.ProcessMessages()
或CheckSynchronize()
(或者你正在使用一个棘手的组件来执行此操作,或者类似的东西,在你不知情的情况下 - >参见:Delphi 7, Windows 7, event handler, re-entrent code)