使用Delphi读取文件时实现超时
发布时间:2020-12-15 09:35:54 所属栏目:大数据 来源:网络整理
导读:我有一个用Delphi 2006编写的应用程序,它定期从位于网络其他位置的磁盘文件(100Mb以太网)读取.偶尔通过网络读取需要很长时间(如20秒)并且应用程序冻结,因为读取是从主线程中的空闲处理程序完成的. 好的,我可以将读取操作放入它自己的线程中,但我想知道的是,
我有一个用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 ; 解决方法
通过在调用CreateFile时包含File_Flag_Overlapped标志,打开文件
asynchronous access.当您调用ReadFile时传入Toverlapped记录,如果读取没有立即完成,该函数将提前返回.您可以通过在存储在TOverlapped结构中的事件上调用WaitForSingleObject来控制等待读取完成的时间.你甚至可以使用MsgWaitForMultipleObjects来等待;然后,一旦读取完成或消息到达,您就会收到通知,以先到者为准,因此您的程序根本不需要挂起.处理完消息后,您可以再次检查I / O是否已完成GetOverlappedResult,恢复等待,或通过调用CancelIo放弃I / O.请务必仔细阅读所有这些功能的文档;异步I / O并非易事.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |