gpt4 book ai didi

delphi - 保证一条信息一次存储在一个位置

转载 作者:行者123 更新时间:2023-12-02 09:06:05 25 4
gpt4 key购买 nike

在应用程序关闭时,我想通过互联网(使用 Indy)将文件发送到服务器。如果数据发送正常,我想从计算机中删除该文件。关键部分是我的文件不应该同时存储在两个地方(服务器、本地计算机)。

例如,我的应用程序可能会在将文件发送到服务器之后、从本地磁盘删除文件之前意外停止。在这种情况下,文件将存在于两个地方。

应用程序可能会因以下原因停止:电源故障、Control+Alt+Del、操作系统关闭、用户关闭、系统挂起(也许还有其他我忘记的原因?)。

如何保证文件存储在一个位置?

<小时/>

我认为我们可以认为将文件写入磁盘是瞬时的,因为文件非常小。

最佳答案

不,没有任何保证。操作系统以及控制操作系统的最终用户始终可以终止该进程。但是,操作系统通常不会尝试这样的事情,并且用户当然不会在不知不觉中杀死您的应用程序。

您可以在关闭期间运行您喜欢的任何代码(例如,在 Form1Close 中)。但是,如果您运行某些代码几秒钟而不处理消息,Windows 可能会认为您的应用程序已卡住,并询问用户是否希望终止它。因此,与往常一样,您应该在自己的线程中执行“慢速”代码,以便主应用程序线程仍然具有响应能力。 [但是,如果最终用户不要求 Windows 终止该进程,则它可以无限期地运行,即使它表现不佳。]

此外,如果您希望这段代码确实运行几秒钟,您最好告诉最终用户发生了什么。例如,您可以显示 please wait窗口。

如果我是你,我会在主窗体中编写一个 OnCloseQuery 处理程序。这个设置 CanClose := false,显示状态窗口,并启动关闭线程。当该线程完成时,它将关闭主窗体(例如,通过向其发送消息)。 OnCloseQuery 处理程序还应该检查关闭线程是否正在运行。如果是这样,它应该简单地设置 CanClose := false 但不启动(另一个)关闭线程。例如,如果最终用户重复单击关闭框,就会发生这种情况。我认为当线程启动主窗体的关闭时,OnCloseQuery 过程也会运行。这次应该可以正常关闭。您可以通过编写一些代码来告诉 OnCloseQuery 处理程序它是由线程启动的,或者通过在线程完成时设置 ShutdownThreadComplete := true 标志来实现此目的。因此,您可以执行 CanClose := ShutdownThreadComplete

类似这样的事情:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if not ShutdownThreadStarted then
begin
CreatePleaseWaitMessage;
StartShutdownThread;
ShutdownThreadStated := true;
CanClose := false;
Exit;
end;

CanClose := ShutdownThreadComplete;
end;

关于delphi - 保证一条信息一次存储在一个位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5300443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com