Подпроцессы (Threads)
Для создания дополнительного подпроцесса в программах Delphy предназначен специальный модуль (в репозитории он представлен пиктограммой Thread Object). При выборе этого модуля Delphi запрашивает имя класса, который будет дочерним для основополагающего класса TThread. Класс TThread содержит абстрактный метод Execute, который должен исполняться в подпроцессе и обязан перекрываться в потомке.
Методы и свойства объектов из библиотеки визуальных компонентов могут использоваться только в рамках вызова метода Synchronize, например:
Procedure MyThread.Execute;
begin
…
Synchronize (UpdateCaption );
end;
где метод UpdateCaption может быть, например, таким:
Procedure MyThread.UpdateCaption;
begin
Form1.Caption := ‘Новый текст метки’;
end;
Любой метод, приводящий к обновлению информации на экране, должен быть синхронизован.
Пример перекрытия абстрактного метода Execute в потомке tMyThread:
Type tMyThread=
class(tThread)
private
myField1:…;
myField2:…;
protected
procedure Execute;override;
…
procedure MyVisualMethod;virtual;
public
constructor create(параметры); (если нужны)
end;
var ThreadsRunning:integer;
procedure tMyThread.execute;
begin
…
Synchronized MyVisualMethod;
…
end;
procedure tMyThread,create(параметр);
begin
inberited create(false);
FreeOnTerminate:=true;
end;
procedure tMyThread.myVisualMethod;
begin
Form1.label2.caption:=…;
If Terminated then Exit;
end;
procedure Form1.StartButtonClick(Sender:tObject);
begin
aThread1:=tMyThread.create(…);
Inc(ThreadsRunning);
aThread1.onTerminate:=ThreadDone;
StartButton.enabled:=false;
aTread2:=tMyThread.reate(…);
Inc(ThreadsRunning);
aThread2.onTerminate:=ThreadDone;
….
end;
procedure Form1.ThreadDone(Sender:tObject);
begin
Dec(ThreadsRunning);
Label1.caption:=IntToStr(ThreadsRunning);
if ThreadsRunning=0 then
StartButton.enabled:=true
end;
procedure Form1.Stop1ButtonClick(Sender:tObject);
begin
aThread1.Terminate
end;
…