進行状況インジケーターを含むメイン フォームがあります。データモジュールには 10 個のデータセットがあり、それぞれに OnBeforeOpen イベントが定義されています。
開いているデータセットの進行状況のパーセンテージをメイン フォームの進行状況バーに表示したいと思います。
私はマルチスレッド プログラミングにまったく慣れていないので、誰かアドバイスをお願いできますか?
どうもありがとうございました
進行状況インジケーターを含むメイン フォームがあります。データモジュールには 10 個のデータセットがあり、それぞれに 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.