有什么更好的方法来挂起程序执行直到满足条件?

时间:2019-06-07 11:14:17

标签: delphi

我需要等到映射的网络文件夹(\ HostName \ NetworkPath)变空。我的意思是,直到该网络文件夹为空,程序流才能继续。

到目前为止,我具有以下逻辑,但是我注意到,FindFirst注意到网络文件夹变空需要花费一些时间。

如果我一直观察到打开的资源管理器窗口,并指向该网络文件夹,我会发现它在 FindFirst注意到它之前很早就变成空了。

我用Sleep(5000)在我的while循环中再次调用CheckNetworkFolderIsEmpty引入了一些延迟,否则会经常调用它。但是也许该文件夹将在5秒之前变空,所以5秒是一个任意时间延迟,如果该文件夹之前变空,则可能导致程序执行中不必要的交易。

可能是罪魁祸首,什么是更好的选择?

我也不知道除了简单的睡眠以外还有什么用。

while not CheckRawFolderIsEmpty do begin
    Sleep(5000);
end;
function TForm1.CheckNetworkFolderIsEmpty: Boolean;
begin
    Result := (CountFilesInFolder('\\HostName\NetworkPath', '*.txt') = 0);
end;

function CountFilesInFolder(const aPath, aFileMask: string): Integer;
var
    Path: string;
    SearchRec: TSearchRec;
begin
    Path := IncludeTrailingPathDelimiter(aPath);
    Result := 0;
    if FindFirst(Path + aFileMask, faAnyFile and not faDirectory, SearchRec) = 0 then begin
        repeat
            Inc(Result);
        until FindNext(SearchRec) <> 0;
        FindClose(SearchRec);
    end;
end;

1 个答案:

答案 0 :(得分:4)

像您一样观察文件系统的更改效率很低(bisonFindFirst),并且在您学到的知识时还不够准确。 Windows FindFirstChangeNotification为此目的提供了API J...

好消息是您不需要从头开始研究API,因为其他人为您做了辛苦的工作。查看有关API的Delphi的一些免费软件包装器: