gpt4 book ai didi

delphi - 用Delphi实现读取文件时的超时

转载 作者:行者123 更新时间:2023-12-03 15:07:59 25 4
gpt4 key购买 nike

我有一个用 Delphi 2006 编写的应用程序,它定期从位于网络(100Mb 以太网)上其他位置的磁盘文件读取。有时,通过网络的读取需要很长时间(例如 20 秒)并且应用程序会卡住,因为读取是从主线程中的空闲处理程序完成的。

好吧,我可以把读操作放到它自己的线程中,但是我想知道是否可以为文件操作指定一个超时,这样你就可以放弃并去做其他事情了,或者报告读取在 20 秒后发生卡住的事实。

function ReadWithTimeout (var Buffer     ;
N : integer ;
Timeout : integer) : boolean ;

begin
Result := false
try
SetReadTimeout (Timeout) ; // <==========================???
FileStream.Read (Buffer, N) ;
Result := true ;
except
...
end ;
end ;

最佳答案

打开 asynchronous access 的文件通过在调用 CreateFile 时包含 File_Flag_Overlapped 标志。调用ReadFile时传入TOverlapped记录,如果读取没有立即完成,函数将提前返回。您可以通过对存储在 TOverlapped 结构中的事件调用 WaitForSingleObject 来控制等待读取完成的时间。您甚至可以使用 MsgWaitForMultipleObjects 来等待;那么一旦读取完成或消息到达(以先到者为准),您就会收到通知,因此您的程序根本不需要挂起。处理完消息后,您可以使用 GetOverlappedResult 再次检查 I/O 是否完成,恢复等待,或通过调用 CancelIo 放弃 I/O。确保仔细阅读所有这些功能的文档;异步 I/O 并不是小事。

关于delphi - 用Delphi实现读取文件时的超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4200793/

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