我有一个带有进度指示器的主表单。在数据模块中,我有十个数据集,每个数据集都定义了OnBeforeOpen事件。
我想通过主表单上的进度条显示已打开数据集的进度百分比。
由于我完全不懂多线程编程,请问有人可以给我一些建议吗?
非常感谢。
我有一个带有进度指示器的主表单。在数据模块中,我有十个数据集,每个数据集都定义了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 - Synchronize Thread with Frame
。这似乎是您问题的重复。提供了一个使用PostMessage()
的示例。 - LU RDApplication.OnIdle
开始。如果您确定有一些非常特殊的条件需要将多线程概念融入问题中,那么也许您可以透露一些关于您的程序、其整体设计和源代码的信息。http://www.catb.org/esr/faqs/smart-questions.html目前您的问题中没有关于多线程的内容,只是关于简单的单线程应用程序。 - Arioch 'The