gpt4 book ai didi

multithreading - Delphi中的线程问题

转载 作者:行者123 更新时间:2023-12-03 15:27:46 25 4
gpt4 key购买 nike

我在 Delphi 中遇到线程问题。当使用 TIdHashMessageDigest5 从大文件中获取 MD5 时,我注意到它花费了太多时间,并且最终导致应用程序卡住。

我正在考虑使用单独的线程。所以我制作了一个小表单,在其中插入一条简单的消息、一个按钮和一个 pbstMarquee 风格的进度条。我在这种形式的显示事件上启动了一个线程。

我的问题是:我想在 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;

最佳答案

没有人指出这一点,函数内部没有返回任何值。

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;
// You are missing this line, calculated md5 was never returned
Result := StrMd5;
end;

关于multithreading - Delphi中的线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6896979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com