ActiveX

Подпроцессы (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;