Потоки



type

TCallback = procedure of Object;

TMyThread = class(TThread)
private
    FCallback: TCallback;
    FStatusText: string;
    procedure DoWork;
protected
    procedure Execute; override;
public
    constructor Create(CreateSuspended : boolean);
    property Callback: TCallback read FCallback write FCallback;
end;


{ TMyThread }

constructor TMyThread.Create(CreateSuspended : boolean);
begin
    FreeOnTerminate := False;
    inherited Create(CreateSuspended);
end;

procedure TMyThread.DoWork;
begin
    if Assigned(FCallback) then
        FCallback;
end;

procedure TMyThread.ShowStatus;
begin
    Form1.Caption := FStatusText;
end;

procedure TMyThread.Execute;
var k:integer;
begin
    Synchronize(@ShowStatus);
    DoWork;
    // Close after work
    Self.Suspend;
end;


{ TForm1 }

procedure TForm1.WaitProc(T:TMyThread);
begin
    while not T.Suspended do
    begin
       Sleep(1000);
       inc(ProgressBar1.Position);
       Application.ProcessMessages;
    end;
end;

BEGIN
    MyThread := TMyThread.Create(True);
    MyThread.OnTick := @VeryLongOperation;
    MyThread.Resume;
    WaitProc(MyThread);
    MyThread.Free;
END.