Mar*_*ato 5 delphi multithreading md5
我在 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;
Run Code Online (Sandbox Code Playgroud)
我的猜测:表单以模态模式(form.ShowModal)打开,并且在计算完成之前有一些东西分配了form.ModalResult。这将导致窗体的 istananeus 关闭。
也许您是否放置了一个将 modalresult 属性设置为 mrOk 的 TBitButton?如果您这样做了,则无论是否有正在运行的线程,按下该按钮都会在 onClick 事件处理程序终止后立即关闭表单。