我有这段代码让我发疯.
FUNCTION DiskInDrive(CONST DriveNumber: Byte): BOOLEAN;
VAR ErrorMode : Word;
BEGIN
RESULT:= FALSE;
ErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
TRY
if DiskSize(DriveNumber) <> -1 { %%%% THIS IS VERY SLOW IF THE DISK IS NOT IN DRIVE !!!!!! }
THEN RESULT:= TRUE;
FINALLY
SetErrorMode(ErrorMode);
END;
END;
Run Code Online (Sandbox Code Playgroud)
它检查磁盘是否已准备好使用(以及提供的驱动器号是否与有效磁盘相对应).问题是,当我尝试访问断开连接的网络驱动器(映射为驱动器的网络文件夹)时,它会冻结大约10-30秒.
代码位于我创建的组件的构造函数中.
如何在不等待那么久的情况下检查驱动器?
首先,你必须意识到你必须等待.访问尚未缓存的可移动媒体是一项昂贵的操作,取决于许多不同的东西(驱动程序,制造商,媒体质量,操作系统版本,服务包,安装的防病毒等)
一旦你达成了这个条款,你不必让你的应用程序实际冻结.我这里没有Delphi,但我会做的是
TThreadedObject并将DiskInDrive逻辑放在其Execute方法中这样你仍然需要等待,但你的应用程序不会没有响应.您甚至可以添加取消操作的选项(如果操作需要很长时间才能完成.)
| 归档时间: |
|
| 查看次数: |
550 次 |
| 最近记录: |