【发布时间】:2012-08-30 11:43:16
【问题描述】:
我已经为ARR 注册了我的申请。假设我的应用程序有一个IdTCPServer,它使用VSPE 从串行端口读取数据并将其添加到ClientDataSet。如果主线程冻结,ARR 将调用我的 ApplicationRecoveryCallback()。我可以安全地访问恢复回调函数中的IdTCPServer吗?我希望它停止,以便在重新启动之前将我的ClientDataSet 保存到磁盘。我可以这样简单地编写我的函数吗?
function RecoveryFunction(pvParameter: Pointer): DWORD; stdcall;
var
ContinueRecovery: Boolean;
begin
Result := 0; // happy compiler ;-)
repeat
ApplicationRecoveryInProgress(ContinueRecovery);
if not ContinueRecovery then
ApplicationRecoveryFinished(False);
until frmInstrument.CriticalSection.TryEnter;
frmInstrument.IdTCPServer.Active := False;
frmInstrument.CDS.SaveToFile(RecoveryFile);
ApplicationRecoveryFinished(True);
end;
【问题讨论】:
-
你为什么不首先停止应用程序冻结?
-
@DavidHeffernan 好问题,但这是保存宝贵数据的最后努力如果我的应用程序将死。我从串口采集的数据来自一堆没有内存的医学实验室仪器,所以当我收到一个数据包时,我应该用生命来保护它,可以这么说。
-
您通过立即将其写入磁盘来保护它。当你这样做时,不需要恢复,因为你已经保存了所有可用的东西。 ARR 文档正是这样建议的。
-
@DavidHeffernan 我已经在处理数据后立即保存了数据。但在某些情况下,尤其是一些旧的“伽马计数器”,仪器发送数据包的速度远远超过我的应用程序可以处理的速度。我的缓冲区中有数据需要写入,我的数据库服务器正在花时间响应我的最后一个查询。我想保存任何尚未保存的内容以防崩溃。
标签: multithreading delphi winapi indy