У меня есть 2 функции, которые могут сказать мне, если файл используется, проверяя, увеличивается ли размер файла. Для работы мне нужно использовать задержку в 5000 мс между каждым размером собранных из того же файла. Это нормально, но он блокирует мой основной поток, поэтому я должен поместить функции внутри потока. Вот функции, которые я использую. Как я могу создать поток, в котором я выполняю функции и получаю результат? Ниже перечислены функции, которые я использую в данный момент. Спасибо!Запустить функцию внутри потока и получить результат
function GetFileSize_mmg(const FileName: string): Int64;
var
fad: TWin32FileAttributeData;
begin
if not GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @fad) then
RaiseLastOSError;
Int64Rec(Result).Lo := fad.nFileSizeLow;
Int64Rec(Result).Hi := fad.nFileSizeHigh;
end;
function does_size_changes(filename:string; delay:integer;memo_loguri:Tmemo): boolean;
var size1,size2:int64;
begin
result:=false;
size1:=GetFileSize_mmg(filename);
sleep(delay);
size2:= GetFileSize_mmg(filename);
if size1 <> size2 then
begin
result:=true;
memo_loguri.Lines.Add(datetimetostr(now)+' - file "'+filename+'" is growing: ' +inttostr(size1)+' < '+inttostr(size2));
end
else
begin
result:=false;
memo_loguri.Lines.Add(datetimetostr(now)+' - file "'+filename+'" can be used: '+ inttostr(size1)+' = '+inttostr(size2));
end;
end;
Вместо того чтобы запрашивать размер файла с течением времени, почему бы просто не спросить ОС, если файл используется? Вы можете попробовать открыть файл в эксклюзивном режиме и посмотреть, произошла ли ошибка нарушения доступа. Или используйте интерфейс ['IFileIsInUse'] (https://msdn.microsoft.com/en-us/library/bb775874.aspx). –
Я уже пробовал это. Работает нормально во всех тестируемых ОС, за исключением того, что файлы были экспортированы из стороннего программного обеспечения. Это специальная ОС, созданная для хранения кластера. Похоже, что в ОС сервера есть ошибка. Я уже говорил с администратором сервера и предупреждал его о большой проблеме безопасности в отношении блокировок файлов (я смог удалить файл, когда он записывался из другого приложения.) До тех пор, пока администратор не исправил эту проблему, я должен изменить свое приложение так что я могу проверить файлы перед их обработкой. – user2858981