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

2024-02-23

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

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


创建线程类时,添加一个变量来存储面板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 相同。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为每个线程分配一个面板 - Delphi 的相关文章

  • 在多线程环境中捕获信号

    我有一个大型程序 需要尽可能具有弹性 并且有大量线程 我需要捕获所有信号SIGBUS SIGSEGV 并在必要时重新初始化有问题的线程 或者禁用该线程以继续减少功能 我的第一个想法是做一个setjump 然后设置信号处理程序 可以记录问题
  • Python 中的方括号和点符号有什么区别?

    我来自 Javascript 背景 可以通过以下方式访问属性 and 符号 所以请原谅我 但是 Python 中两者之间到底有什么区别 从我的实验看来 应该始终使用 两者都可以获取 a 的索引list or set并从 a 中的某个键获取值
  • Java 创建 Thread 实例时会发生什么

    我有一个关于 Java 线程和操作系统线程的问题 我读了Java 线程与 Pthreads https stackoverflow com questions 5269535 java threads vs pthreads and Jav
  • 在 Groovy 中分配对象属性的简写方法?

    我使用此约定创建 Groovy 对象 Item item1 new Item name foo weight 150 是否有操作属性对象的速记约定 像这样的东西 item1 name hello weight 175 this does n
  • 如何以编程方式安排任务

    如何使用 delphi 7 像 Google updater 一样安排任务 我没有使用注册表 因为它被卡巴斯基防病毒软件检测为误报 我在注册表中作为启动项添加的任何内容都会被检测为特洛伊木马 因此我决定使用任务计划 下面的代码展示了如何删除
  • 如何在 Vista 上安装 Delphi 7

    我多次尝试在 Vista 上安装 Delphi 7 但 Vista 告诉我此应用程序 Delphi 7 存在已知问题 从而阻止了我这样做 我公司的其他几个人在 Vista 上安装 D7 时遇到了问题 由此得出的结论是 我们的 D7 应用程序
  • 如何在 OSX 上的应用程序名称下创建子项菜单?

    如何在下面添加TMenuItemProject1以上Quit在下面的屏幕截图上 我创建了一个 TMenuBar 并选中了 UseOSMenu 属性 我添加的第一个 TMenuItem 是主栏中的第二个 TMenuItem 您可以通过将 II
  • Java 线程何时达到“死亡”状态

    在 Java 中 Die 是线程的状态之一 什么原因导致线程进入这种状态 来自线程API http java sun com javase 6 docs api java lang Thread html 这是一个完整的列表 如果 run
  • 处理两个传入的数据流并将它们组合在 python 中?

    我一直在研究Python中线程 多处理异步等的各种选项 作为处理两个传入流并将它们组合起来的方法 有关的信息很多 但示例往往令人费解且复杂 更常见的是将单个任务拆分为多个线程或进程 以加快任务的最终结果 我有一个通过套接字传入的数据流 当前
  • 在没有“跨线程”的情况下,我可以从BackgroundWorker访问什么?

    我意识到我无法从BackgroundWorker 的DoWork 事件处理程序访问表单控件 如果我尝试这样做 我会得到一个异常 正如预期的那样 但是 我是否可以访问表单上存在的其他 自定义 对象 例如 我创建了一个 设置 类并在我的表单中实
  • 如何对请求使用线程? [复制]

    这个问题在这里已经有答案了 您好 我正在使用请求模块 我想提高速度 因为我有很多网址 所以我想我可以使用线程来获得更好的速度 这是我的代码 import requests urls http www google com http www
  • Delphi TImageList 位图更改

    我正在使用 Delphi XE2 Update 3 Update 4 与我们的一些第 3 方组件不兼容 因此我们尚未更新 我在我的应用程序中使用 TImageList 我注意到很多时候当它从源视图切换到表单视图 F12 时 突然之前未修改的
  • 跟踪 C#/.NET 任务流

    我正在尝试找到一种方法来跟踪异步任务执行流程 以便轻松理解任务 启动它的原始流程是什么 我主要需要它来记录 调试和保留特定执行流的堆栈跟踪 例如 如果我的服务器有来自多个 IP 的许多客户端 并且服务器需要为每个客户端执行一个涉及许多异步操
  • 在非 UI 线程上运行 RIA 服务

    我正在尝试从非 UI 线程进行 RIA 服务调用 我通过打开新线程和后台工作人员进行了调用 但对于这两种情况 回调都在 UI 线程上运行 是否可以在调用者线程而不是 UI 上执行回调 Thanks tl dr Use WCF 自行将结果编组
  • 按值数组过滤对象数组中的嵌套数组

    考虑以下对象数组 guid j5Dc9Z courses id 1 name foo guid a5gdfS courses id 2 name bar
  • 如何找到锁的所有者(监视器)?

    有没有办法发现哪个线程当前拥有锁 具体来说 我正在寻找一些代码来打印出阻止锁定的线程 我想尝试锁定给定的超时时间 然后报告哪个线程正在阻止锁定 不需要 只需编写代码 private int lockOwner private object
  • 我可以让我的 Delphi 应用程序在特定时间(例如上午 12:00)启动,而不运行应用程序吗?

    我看到一个已安装的应用程序 它从供应商的网站提供一些 XML 数据并将其显示在主窗体窗口中 我想这很简单 但我注意到 即使我关闭系统托盘中的应用程序 明天早上 上午 12 00 正好 它也会再次弹出 这太酷了 我不确定它是用 Delphi
  • 如何一次运行多个后台线程任务?

    我正在尝试循环遍历包含 2016 年 10 月日期的 String 对象数组 这意味着 31 个 String 对象 2016 年 10 月 1 日 2016 年 10 月 31 日 对于每个对象 我想从数据库检索一些数据并附加返回值 也是
  • 如何在 iPhone 应用程序中运行进程而不阻塞用户界面

    我正在 iPhone 上访问照片库 需要很长时间才能导入我在应用程序中选择的图片 如何在辅助线程上运行该进程 或者我应该使用什么解决方案来不阻塞用户界面 我在这里使用 PerformSelectOnBackground 或 GCD 对示例代
  • ASP.NET 中的 ThreadStaticAttribute

    我有一个需要存储的组件static每个线程的值 它是一个通用组件 可以在许多场景中使用 而不仅仅是在 ASP NET 中 我想用 ThreadStatic 属性来实现我的目标 假设它在 ASP NET 场景中也能正常工作 因为我假设每个请求

随机推荐