Delphi:在外部控制处理期间形成被动UI

Delphi: form as passive UI during externally controlled processing

在 Delphi 表单应用程序中,如何让处理代码在没有用户输入的情况下执行,以及如何让 UI 以给定的帧速率更新?

问题代码是testing/measuring组件在重负载下并发运行的测试框架,在相同或不同的机器上有多个进程。重点主要是数据库操作(点对点或基于服务器)和文件系统 reliability/performance 关于文件和字节范围锁定,尤其是在具有异构客户端操作系统的网络上。

框架等待发出测试开始和停止信号的外部事件(IPC、文件系统、网络)运行;在开始信号之后,它会在一个紧密的循环中调用提供的测试函数,直到收到停止信号。然后等待下一个启动信号或退出信号。

多年来我一直在 FoxPro 中做类似的事情。这很容易,因为 Fox 不必像 Delphi 的 Application.Run(); 那样坐在消息泵上;所以我只是提出了一个非模态形式,安排它每几百毫秒刷新一次,然后深入到程序代码中。在原始 Win16/Win32 中,它稍微不那么容易,但仍然相当简单。

在 Delphi 中,我什至不知道去哪里找,文档 (D7+XE2) 的结构到目前为止已经成功地挑战了我。在 Delphi 中执行此操作的最简单方法是什么?我想我总是可以为实际处理启动一个新线程,并使用像 RedrawWindow() 和 PostQuitMessage() 这样的原始 Win32 调用来使应用程序按照我的意愿弯曲。但这看起来很笨拙。一定有 'delphier' 种方法可以做到这一点?

创建一个后台线程来做处理任务。这使得主 UI 线程可以根据需要自由地为其消息循环提供服务。

任务需要向用户呈现的任何信息都必须同步或排队到主 UI 线程。当然,编写完整的应用程序需要更多细节,但线程是解决方案。您可以使用高级库来保护自己免受原始线程的影响,但这不会改变您需要将处理卸载到除主 UI 线程以外的线程的基本事实。