下午好 :-),
我有一个框架。这个框架是我通过主窗体动态创建的。
主要形式:
Interface := TInterface.Create(self);
with handlingInterface do begin
Parent := Form1;
Left := 0; Top := 35;
Width := 570; Height := 250;
end;
在框架中我有一个线程。我将此称为“框架中的线程”。为什么Thread和Frame可以同步?没有任何:
var
Form1: TForm1;
I 在框架内调用线程我想改变位置框架中的进度条。我不知道,为什么我可以在Thread的Synchronize方法中访问ProgressBar。
如果是 Form 中的 Thread 和 ProgressBar - 同步访问是 Form1.ProgressBar ...
但我有 Thread 和 ProgressBarFrame.
如果您唯一想做的就是从线程更新进度条,那么有一个更轻量级的选项。我会考虑使用 PostMessage 代替。无论如何,您都不希望线程了解太多有关框架的细节。
创建线程时,为其提供框架的句柄,以便它知道将消息发布到哪里。让框架侦听 Windows 消息(其中包括进度位置)并更新进度栏。
这是一个非常简单的示例,它将进度条从 0 增加到 100,并在每次增量之间短暂休眠:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
const
WM_PROGRESS_MESSAGE = WM_USER + 99;
type
TProgressThread = class(TThread)
private
FWindowHandle: HWND;
protected
procedure Execute; override;
public
property WindowHandle: HWND read FWindowHandle write FWindowHandle;
end;
TFrame2 = class(TFrame)
ProgressBar1: TProgressBar;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure OnProgressMessage(var Msg: TMessage); message WM_PROGRESS_MESSAGE;
public
end;
implementation
{$R *.dfm}
{ TFrame2 }
procedure TFrame2.Button1Click(Sender: TObject);
var
lThread: TProgressThread;
begin
lThread := TProgressThread.Create(True);
lThread.FreeOnTerminate := True;
lThread.WindowHandle := Self.Handle;
lThread.Start;
end;
procedure TFrame2.OnProgressMessage(var Msg: TMessage);
begin
ProgressBar1.Position := Msg.WParam;
end;
{ TProgressThread }
procedure TProgressThread.Execute;
var
lProgressCount: Integer;
begin
inherited;
for lProgressCount := 0 to 100 do
begin
PostMessage(FWindowHandle, WM_PROGRESS_MESSAGE, lProgressCount, 0);
Sleep(15);
end;
end;
end.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)