1 delphi multithreading freeze
我有一点问题.我想显示一个进度表单,它只是在主应用程序执行大量操作时显示动画.
我在一个线程中完成了这个,当用户没有执行任何操作时,它工作正常.但它只是在我的主应用程序繁忙时停止.
我无法将Application.ProcessMessages放在不同的代码行之间,因为我使用的是处理时间很长的第三方组件.
我的想法是创建一个新进程,并在此过程中创建一个执行动画的线程.现在,当主应用程序执行大量操作时,这不会停止执行线程.
但是正如我所看到的,如果你执行一个新程序,你只能创建一个新进程.
有没有人有一个解决方案,即使主应用程序繁忙时如何让线程继续执行?
/布赖恩
如果您的工作线程的优先级不低于主线程,则不使用该Synchronize()
方法,不要调用SendMessage()
并且不尝试获取主GUI线程已经获取的任何同步对象,然后是您的辅助线程应该继续工作.
由于VCL不是线程安全的,人们经常建议Synchronize()
在VCL线程的上下文中使用执行代码来同步更新VCL控件.但是,如果VCL线程本身很忙,则这不起作用.您的工作线程将阻塞,直到主线程继续处理消息.
无论如何,您的应用程序设计是不幸的.您应该在工作线程中执行所有冗长的操作,并保持主线程响应用户交互.即使使用花哨的动画,您的应用程序也会显示为用户,因为在VCL线程忙于执行其他操作并且不处理任何消息时,它不会重绘.尝试将冗长的代码放在工作线程中,并在主线程中的计时器事件中执行动画.
你的逻辑是落后的.您的线程应该执行"繁重的工作",并将消息传递到主应用程序以更新进度或动画.
如果您将所有"繁重的工作"留在主应用程序中,则另一个线程将无法获得足够的执行机会,这意味着它将无法更新任何内容.此外,所有对GUI(VCL控件)的访问都必须在应用程序的主线程中进行; VCL不是线程安全的.(在视觉控制方面,Windows本身也不是.)
归档时间: |
|
查看次数: |
4684 次 |
最近记录: |