如果我正确理解了您的问题,那么您的 EXE 中有一些代码,而 DLL 中有一些代码。每隔一段时间,就会触发一个计时器,这会导致某些东西轮询其他东西(不清楚谁在轮询什么)以查看一侧是否有任何工作可用,而另一侧的代码可以处理这些工作。而且您希望有一种方法让一方在有工作时立即通知另一方,而不必等待计时器。
有一种非常成熟的方法可以做到这一点。在 Delphi 中设置它的标准习惯用法是使用事件和事件处理程序。基本思路如下:
我们将创建数据的一方称为发布者,将处理工作的一方称为消费者。给 Publisher 对象一个TNotifyEvent 类型的变量。这在Classes 单元中声明为
TNotifyEvent = procedure(Sender: TObject) of object;
如果这看起来很熟悉,那是因为很大一部分 VCL 事件处理程序(例如 TButton.OnClick)属于 TNotifyEvent 类型。如果你想在事件中传递一些更有用的数据,你可以声明你自己的事件类型。例如:
TDataReadyEvent = procedure(data: TStatisticalData) of object;
将您的事件处理程序类型的变量放在发布者 (FOnDataReady: TDataReadyEvent;) 上并创建一个公开它的属性。然后添加一些代码来触发事件。在 Producer 中的某处,您有生成要分析的新数据的代码。完成后,添加如下内容:
if assigned(FOnDataReady) then
FOnDataReady(NewData);
然后,在 Consumer 上创建一个签名与事件处理程序类型匹配的方法。它应该能够处理数据。要将它们链接在一起,请在消费者的初始化代码中执行以下操作:
Producer.OnDataReady := self.HandleDataReady;
你有它!真的就是这么简单。现在,只要 Producer 有新数据可用,就会自动调用您的 Consumer,而无需使用计时器并不断轮询 Producer 询问它是否有任何东西。