delphi - 如何从第二个线程更新进度指示器?

标签 delphi omnithreadlibrary

我有一个带有进度指示器的主窗体。 在数据模块中,我有十个数据集,每个数据集都定义了一个 OnBeforeOpen 事件。

我想通过主窗体中的进度条显示打开数据集的进度百分比。

由于我对多线程编程完全陌生,有人可以给我一些建议吗?

非常感谢

最佳答案

将消息从线程发布到主线程并从那里更新进度条,或者使用 TThread.Queue 方法在主线程的上下文中执行一些代码。

unit Unit12;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;

const
  WM_UPDATE_PB = WM_USER;

type
  TForm12 = class(TForm)
    ProgressBar1: TProgressBar;
    ProgressBar2: TProgressBar;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
    procedure WMUpdatePB(var msg: TMessage); message WM_UPDATE_PB;
  end;

var
  Form12: TForm12;

implementation

{$R *.dfm}

procedure UpdateFromThreadViaMessage;
var
  i: integer;
begin
  for i := 1 to 100 do begin
    Sleep(20);
    PostMessage(Form12.Handle, WM_UPDATE_PB, i, 0);
  end;
end;

procedure UpdateFromThreadViaQueue;
var
  i: integer;
begin
  for i := 1 to 100 do begin
    Sleep(20);
    TThread.Queue(nil,
      procedure begin
        Form12.ProgressBar2.Position := i;
      end);
  end;
end;

procedure TForm12.Button1Click(Sender: TObject);
begin
  TThread.CreateAnonymousThread(UpdateFromThreadViaMessage).Start;
  TThread.CreateAnonymousThread(UpdateFromThreadViaQueue).Start;
end;

procedure TForm12.WMUpdatePB(var msg: TMessage);
begin
  ProgressBar1.Position := msg.WParam;
end;

end.

关于delphi - 如何从第二个线程更新进度指示器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15782823/

相关文章:

multithreading - OmniThreadLibrary:如何检测所有递归调度(=池化)线程何时完成?

delphi - WinInet HttpQueryInfo 可以返回原始字节吗? (带有 unicode 字符的 HTTP header )

Delphi 和阻止事件处理

Delphi Berlin 10.1 除零异常缺失

delphi - 如何将参数传递给 OmniThreadLibrary 中的 Parallel.Async()?

multithreading - TOmniEventMonitor 可以在后台线程中使用吗?

android - Delphi 移动 UIActionSheet 跨平台等效项

delphi - 为什么TStringStream转换为字符串时不去掉BOM?

delphi - 这是使用OmniThreadLibrary的正确方法-终止现有的然后创建一个新的吗?

multithreading - Delphi 2010 中其他线程的执行点