gpt4 book ai didi

multithreading - Delphi异步写入TListBox

转载 作者:行者123 更新时间:2023-12-01 23:22:15 25 4
gpt4 key购买 nike

我想从多个线程/进程写入一个名为“listMessages”的 TListBox,我有这两个过程来执行此操作:

1- 添加对象:

procedure Log(Msg: String; Color: TColor);
begin
listMessages.Items.AddObject(Msg, Pointer(Color));
listMessages.ItemIndex := listMessages.Items.Count -1;
end;

2- TIdCriticalSection 名为 protectListMessages :

procedure TMainForm.safelyLogMessage(mess : String);
begin
protectlistMessages.Enter;
try
listMessages.Items.Add(mess);
listMessages.ItemIndex := listMessages.Items.Count -1;
finally
protectListMessages.Leave;
end;
end;

你能告诉我哪个是最好的(快速+线程安全)或者告诉我第三种方法从我的线程/进程向我的TListBox写入消息?

最佳答案

你的选择都没有任何好处。你需要使用选项3!

重点是所有对 UI 控件的访问都必须在主线程上执行。使用 TThread.SynchronizeTThread.Queue 将 UI 代码编码到主 UI 线程上。一旦执行此操作,代码将不需要任何进一步的序列化,因为让它在 UI 线程上运行的行为本身就对其进行了序列化。

代码可能如下所示:

procedure TMainForm.Log(const Msg: string; const Color: TColor);
var
Proc: TThreadProcedure;
begin
Proc :=
procedure
begin
ListBox1.AddItem(Msg, Pointer(Color));
ListBox1.ItemIndex := ListBox1.Count-1;
end;

if GetCurrentThreadId = MainThreadID then
Proc()
else
TThread.Queue(nil, Proc);
end;
<小时/>

在您的更新中,您声明您需要从不同的进程写入列表框。使用问题中的任何代码都无法实现这一点。为此,您需要进程间通信(IPC)。发送 Windows 消息是一种合理的方法,但还有其他可用的 IPC 选项。但我认为当你使用“过程”一词时,你说错了。我怀疑你说的不是过程,但我不知道你的意思是什么。

关于multithreading - Delphi异步写入TListBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24551490/

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