【发布时间】:2021-08-16 22:14:21
【问题描述】:
我在 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;
【问题讨论】:
-
你好,表单是模态表单,但是当 HashStreamAsHex 方法返回文件的 md5 时,我需要关闭表单。这个方法è在一个线程中调用。对于大文件实际上需要几分钟并冻结。
-
可以告诉我正确显示带有缩进的delphi代码吗?如您所见,我有一些问题:(我错在哪里?非常感谢。
-
选择代码块并按下{}按钮
-
请原谅,{} 按钮在哪里?我已经搜索了所有页面但没有找到:(
-
编辑代码时,编辑框上方有一个按钮工具栏。点击看起来像 {} 的那个
标签: multithreading delphi md5