gpt4 book ai didi

multithreading - Delphi:在线程中分配字符串时表单变得卡住

转载 作者:行者123 更新时间:2023-12-03 03:35:59 24 4
gpt4 key购买 nike

下面的代码位于线程中。

Tf1 := TFileStream.Create(LogsPath,fmOpenRead or fmShareDenyNone);
...
str:=TStringList.Create;
str.LoadFromStream(tf1);
...
SynEditLog.Lines.Assign(str); // I do this with Synchronize

文本文档中有 30 000 个字符串。

将这些字符串分配给 SynEdit 时,表单会被卡住。

如果逐个加载字符串,需要 40 秒...如果使用分配 - 8 秒。

如何防止此表单的状态?

谢谢!!!

最佳答案

我认为 Application.ProcessMessages 在这里根本没有帮助,因为所有工作都发生在对 Assign 的一次调用中。

SynEditLogBeginUpdate/EndUpdate方法吗?我会使用它们,看看你进展如何。例如:

SynEditLog.BeginUpdate;
try
SynEditLog.Lines.Assign(str);
finally
SynEditLog.EndUpdate;
end;

回应无效

您需要分解字符串列表对 Lines 属性的分配。像这样的事情:

var
LIndex: integer;
begin
SynEditLog.BeginUpdate;
try
//added: set the capacity before adding all the strings.
SynEditLog.Lines.Capacity := str.Capacity;
for LIndex := 0 to str.Count - 1 do
begin
SynEditLog.Lines.Add(str[LIndex]);
if LIndex mod 100 = 0 then
Application.ProcessMessages;
end;
finally
SynEditLog.EndUpdate;
end;
end;

(注意:直接在浏览器中输入代码,可能无法编译)

如果这太慢,请尝试将 LIndex mod 100 = 0 增加到更大的值,例如 1000 甚至 5000。

N@

关于multithreading - Delphi:在线程中分配字符串时表单变得卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6728234/

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