我遇到了一些问题。我想显示一个进度表单,它只是在主应用程序执行大量操作时显示动画。
我在一个帖子中完成了这个,当用户没有执行任何操作时,它工作正常。但它只是在我的主应用程序忙碌时停止。
我无法将Application.ProcessMessages放在不同的代码行之间,因为我使用的是处理时间很长的第三方组件。
我的想法是创建一个新进程,并在此过程中创建一个执行动画的线程。现在,当主应用程序执行大量操作时,这不会停止执行线程形式。
但是正如我所看到的,如果你执行一个新程序,你只能创建一个新进程。
是否有人有解决方案如何让线程继续执行,即使主应用程序正忙?
/布赖恩
答案 0 :(得分:9)
如果您的工作线程的优先级不低于主线程,则不使用Synchronize()
方法,不要调用SendMessage()
并且不要尝试获取任何同步对象主GUI线程已经获得,那么你的辅助线程应该继续工作。
由于VCL不是线程安全的,人们经常建议使用Synchronize()
执行代码以在VCL线程的上下文中同步更新VCL控件。但是,如果VCL线程本身很忙,则这不起作用。您的工作线程将阻塞,直到主线程继续处理消息。
无论如何,您的应用程序设计是不幸的。您应该在工作线程中执行所有冗长的操作,并保持主线程响应用户交互。即使使用花哨的动画,您的应用程序也会显示为用户,因为在VCL线程忙于执行其他操作并且不处理任何消息时,它不会重绘。尝试将冗长的代码放在工作线程中,并在主线程中的计时器事件中执行动画。
答案 1 :(得分:7)
你的逻辑是落后的。你的线程应该做“繁重的工作”,并将消息传递给你的主应用程序来更新进度或动画。
如果您将所有“繁重的工作”留在主应用程序中,则另一个线程将无法获得足够的执行机会,这意味着它将无法更新任何内容。此外,所有对GUI(VCL控件)的访问都必须在应用程序的主线程中进行; VCL不是线程安全的。 (当涉及到视觉控制时,Windows本身也不是。)
答案 2 :(得分:0)
如果通过“即使主应用程序繁忙,有没有人可以解决如何让线程继续执行?”你的意思是主线程忙,你应该将正在完成主线程的代码移动到另一个其他线程。换句话说,主线程应负责启动和停止操作而不执行它们。 Disclaymer: 其实我不知道delphy,但我认为/希望这些概念与C ++或C#完全相似。