1

我有点问题。我想显示一个进度表单,它只在主应用程序执行繁重操作时显示动画。

我已经在一个线程中完成了这项工作,当用户不执行任何操作时它工作正常。但它只是在我的主应用程序繁忙时停止。

我无法将 Application.ProcessMessages 放在不同的代码行之间,因为我正在使用处理时间很长的 3rdparty 组件。

我的想法是创建一个新进程,并在该进程中创建一个执行动画的线程。现在,当主应用程序执行繁重的操作时,这不会停止线程表单的执行。

但正如我所见,只有执行新程序才能创建新进程。

即使在主应用程序很忙的情况下,有没有人有关于如何使线程继续执行的解决方案?

/布莱恩

4

3 回答 3

9

如果你的工作线程的优先级不低于主线程,你不使用该Synchronize()方法,不调用SendMessage()也不尝试获取主GUI线程已经获取的任何同步对象,那么你的辅助线程应该继续工作。

由于 VCL 不是线程安全的,人们经常建议使用Synchronize()执行代码来在 VCL 线程的上下文中同步更新 VCL 控件。但是,如果 VCL 线程本身很忙,这将不起作用。您的工作线程将阻塞,直到主线程继续处理消息。

无论如何,您的应用程序设计是不幸的。您应该在工作线程中执行所有冗长的操作,并保持主线程响应用户交互。即使使用精美的动画,您的应用程序也会对用户显示为挂起,因为当 VCL 线程忙于做其他事情并且不处理任何消息时它不会重绘。尝试将冗长的代码放在工作线程中,并在主线程的计时器事件中执行动画。

于 2009-11-13T13:43:06.490 回答
7

你的逻辑是落后的。您的线程应该做“繁重的工作”,并将消息传递给您的主应用程序以更新进度或动画。

如果您将所有“繁重的工作”留在主应用程序中,另一个线程将没有足够的机会执行,这意味着它没有机会更新任何内容。此外,所有对 GUI(VCL 控件)的访问都必须发生在应用程序的主线程中;VCL 不是线程安全的。(在视觉控制方面,Windows 本身也不是。)

于 2009-11-13T13:43:31.183 回答
0

如果通过“是否有人有解决方案,即使主应用程序很忙,如何使线程继续执行?” 您的意思是主线程很忙,您应该将消耗主线程的代码移动到另一个其他线程。换句话说,主线程应该负责启动和停止动作而不是执行它们。Disclaymer:实际上我不了解 delphy,但我认为/希望这些概念与 C++ 或 C# 非常相似。

于 2009-11-13T13:45:24.083 回答