程序在访问断开连接的驱动器时冻结30秒

WeG*_*ars 3 delphi

我有这段代码让我发疯.

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秒.

代码位于我创建的组件的构造函数中.

如何在不等待那么久的情况下检查驱动器?

Leo*_*era 5

首先,你必须意识到你必须等待.访问尚未缓存的可移动媒体是一项昂贵的操作,取决于许多不同的东西(驱动程序,制造商,媒体质量,操作系统版本,服务包,安装的防病毒等)

一旦你达成了这个条款,你不必让你的应用程序实际冻结.我这里没有Delphi,但我会做的是

  • 创建一个新的TThreadedObject并将DiskInDrive逻辑放在其Execute方法中
  • 使用变量来设置/获取此结果
  • 启用/禁用相应的可视控件.

这样你仍然需要等待,但你的应用程序不会没有响应.您甚至可以添加取消操作的选项(如果操作需要很长时间才能完成.)