gpt4 book ai didi

multithreading - 为每个线程分配一个面板 - Delphi

转载 作者:行者123 更新时间:2023-12-03 18:02:01 25 4
gpt4 key购买 nike

我有一个同时运行多个线程的程序。每个线程连接一个数据库并将数据从一个表传输到另一个表。现在我想为 MainForm 中的每个线程分配一个面板,这样我就可以将面板的颜色更改为绿色(如果连接成功)或更改为红色(如果在多次重试后连接断开)。

那么我怎样才能告诉线程哪个面板是它自己的面板呢?

最佳答案

创建线程类时,添加一个变量来存储面板id:

type
TMyThread = class(TThread)
public
PanelId: integer;
constructor Create(APanelId: integer);
end;

constructor TMyThread.Create(APanelId: integer);
begin
inherited Create({CreateSuspended=}true);
PanelId := APanelId;
Suspended := false;
end;

为每个线程创建一个面板并将其标签值设置为此 Id:

for i := 1 to MaxThreads do begin
threads[i] := TMyThread.Create(i);
panels[i] := TPanel.Create(Self);
panels[i].Tag := i;
end;

当你的线程需要更新面板上的数据时,它应该向主窗体发送一个专门定义的消息:

const
WM_CONNECTED = WM_USER + 1;
WM_DISCONNECTED = WM_USER + 2;

在此消息的 wParam 中,您传递 PanelId:

procedure TMyThread.Connected;
begin
PostMessage(MainForm.Handle, WM_CONNECTED, PanelId, 0);
end;

在 MainForm 中,您收到此消息,找到面板并更新它:

TMainForm = class(TForm)
{....}
protected
procedure WmConnected(var msg: TMessage); message WM_CONNECTED;
end;

{...}

procedure TMainForm.WmConnected(var msg: TMessage);
begin
panels[msg.wParam].Color := clGreen;
end;

与 WmDisconnected 相同。

这里重要的是你不能也永远不应该尝试从主线程以外的线程更新可视化组件。如果您需要更新用户控件,您应该将消息发布到主窗体并创建处理程序,如本例所示。然后这些处理程序将从主线程自动调用。

关于multithreading - 为每个线程分配一个面板 - Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4377677/

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