Реализация многопоточности в Delphi
Стандартный мастер модулей в Delphi автоматически создает модуль содержащий класс потока с указанным именем. Весь код который необходимо вынести в отдельный поток помещается в метод класса Execute.
Базовый класс для создания потока пользователя – TThread
TThread = class
protected
procedure DoTerminate; virtual;
procedure Execute; virtual;
procedure Synchronize(Method: TThreadMethod);
property ReturnValue: Integer;
property Terminated: Boolean;
public
constructor Create(CreateSuspended: Boolean);
procedure Resume;
procedure Suspend;
procedure Terminate;
function WaitFor: LongWord;
property FreeOnTerminate: Boolean;
property Handle: Thandle;
property Priority: TthreadPriority;
property Suspended: Boolean;
property ThreadID: Thandle;
property OnTerminate: TnotifyEvent;
end;
Процесс, породивший поток может гибко управлять его состоянием: приоритетом Priority; приостановить и продолжить его исполнения, а так же досрочно завершить выполнение потока.
Для вызова методов VCL необходимо синхронизировать дочерний поток с главным. Для этого служит процедура Synchronize(Method:TThreadMethod);
unit Unit1;
interface
uses
Classes;
type
TSamples = class(TThread)
private
protected
procedure Execute; override;
end;
implementation
{ Подсказка Delphi по поводу Synchronize.
Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure Samples.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ Samples }
procedure TSamples.Execute;
begin
{ Здесь должен быть размещен код потока }
end;
end.