У меня проблема с потоками в Delphi. При использовании TIdHashMessageDigest5 для получения MD5 из большого файла я заметил, что это занимает слишком много времени и приводит к зависанию приложения.
Я думаю об использовании отдельной темы. Поэтому я создал небольшую форму, в которую вставляю простое сообщение, кнопку и индикатор выполнения в стиле pbstMarquee. Я запускаю тему в событии show этой формы.
Моя проблема: я хочу закрыть эту форму, когда HashStreamAsHex успешно завершил чтение, но как я могу это сделать? Я попытался вызвать метод Close при синхронизации, но затем форма закрывается, не дожидаясь завершения этого потока. Я также попытался использовать метод waitfor, но безуспешно.
Кто-то может помочь мне с этим, приведя пример или ссылку или подобное?
Большое спасибо и извините за мой плохой английский.
About form:
-----------
procedure TFormProgress.FormProgressOnShow(Sender: TObject);
begin
ProgressThread := TProgressThread.Create(True);
ProgressThread.Form := FormProgress;
ProgressThread.FileSrc := uFileSrc;
ProgressThread.Start;
end;
About thread:
-------------
procedure TProgressThread.Execute;
begin
FreeOnTerminate := True;
uFileMD5 := GetFileMd5 (uFileSrc) // function is definited in other unit.
Self.WaitFor;
Synchronize(DoSync);
end;
procedure TProgressThread.DoSync;
begin
oForm.Close;
end;
GetFileMd5 è so defined:
function GetFileMD5(const Src: TFileName): UnicodeString;
var
Md5: TIdHashMessageDigest5;
FileSrc: TFileStream;
StrMd5: UnicodeString;
begin
Md5 := TIdHashMessageDigest5.Create;
try
FileSrc := TFileStream.Create(Src, fmOpenRead);
try
StrMd5 := Md5.HashStreamAsHex(FileSrc);
finally
FileSrc.Free;
end;
finally
Md5.Free;
end;
end;