- Delphi - Synchronize Thread with Frame
- Interface := TInterface.Create(self);
- with handlingInterface do begin
- Parent := Form1;
- Left := 0; Top := 35;
- Width := 570; Height := 250;
- end;
- var
- Form1: TForm1;
- unit Unit6;
- interface
- uses
- Classes, ComCtrls;
- type
- TProgressBarThread = class(TThread)
- private
- { Private declarations }
- FProgressBar: TProgressBar;
- procedure MoveProgress;
- protected
- procedure Execute; override;
- public
- procedure SetProgressBar(ProgressBar: TProgressBar);
- end;
- implementation
- { ProgressBarThread }
- procedure TProgressBarThread.Execute;
- begin
- { Place thread code here }
- Synchronize(MoveProgress);
- end;
- procedure TProgressBarThread.MoveProgress;
- begin
- FProgressBar.StepIt;
- end;
- procedure TProgressBarThread.SetProgressBar(ProgressBar: TProgressBar);
- begin
- FProgressBar := ProgressBar;
- end;
- end.
- var
- PBT: TProgressBarThread;
- begin
- PBT := TProgressBarThread.Create(True);
- PBT.FreeOnTerminate := True;
- PBT.SetProgressBar(ProgressBar1);
- PBT.Start;
- // PBT.Resume;
- end;
- 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.