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

Delphi 如何从第二个线程更新进度指示器?,delphi,omnithreadlibrary,Delphi,Omnithreadlibrary,我有一个主窗体,上面有一个进度指示器。 在datamodule中,我有十个数据集,每个数据集都定义了一个OnBeforeOpen事件 我想通过主窗体中的进度条显示已打开数据集的进度百分比 由于我对多线程编程一无所知,有人能给我一些建议吗 非常感谢将一条消息从线程发送到主线程并从那里更新进度条,或者使用TThread.Queue方法在主线程的上下文中执行一些代码 unit Unit12; interface uses Winapi.Windows, Winapi.Messages, Sys

我有一个主窗体,上面有一个进度指示器。 在datamodule中,我有十个数据集,每个数据集都定义了一个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.

看见似乎是重复你的问题。提供了如何使用
PostMessage()
执行此操作的示例。OTL在这里必须做什么?目前,您描述的甚至不是单线程程序,而是一个静态的、暂停在断点1中的程序。您有一个静态并希望显示它。嗯,有很多选择,从
Application.OnIdle
开始。如果您确定您有一些非常特殊的情况,需要将多线程的概念混合到问题中,那么您也许可以透露一些关于您的程序、其总体设计和源代码的信息。到目前为止,我们的问题中没有关于多线程的内容,而是关于简单的单线程应用程序。是的,为什么需要线程呢?只需在
OnBeforeOpen
事件中更新您的进度指示器即可。谢谢:最后我使用了UpdateFromThreadViaQueue,它运行得非常好。我选择你的答案是因为它帮助我理解线程消息和线程队列是如何工作的。在研究了您的答案以及我的问题的所有其他答案之后,我现在可以理解为什么在这种特定情况下不需要使用线程。@Fabio OTL有自己的消息传递原语,基本上使用PostMessage,但是,它们更符合OTL风格,例如,演示和OTL开发者博客文章。@Arioch非常感谢您为我指出OTL的资源:我将研究其中的示例???在不知道OTL资源的情况下,如何下载和使用OTL?