Общий
обзор потоков
Поток (Thread) —
это объект операционной системы, заключенный в процесс и реализующий
какую-либо задачу. Любое приложение (процесс) содержит несколько потоков (как
минимум, один, который называется основным, стандартным. В большинстве приложений
вы можете использовать объект потока, который позволяет вам использовать
потоки в ваших приложениях. Объекты потоков инкапсулируют в себе основные свойства
и методы, необходимые для написания многопоточных приложений.
Итак, любой поток — это
объект, получающий определенное процессорное время. Всякое приложение Linux
является процессом операционной системы.
Примечание
Объекты потоков не позволяют вам управлять атрибутами безопасности или размером стека ваших потоков. Для того чтобы контролировать их, вам необходимо использовать функцию
BegmThread
, которая рассматривается далее.
Для того чтобы использовать
объекты потоков в вашем приложении, вам нужно создать потомок класса TThread
.
Класс TThread
был создан для облегчения написания приложений с несколькими потоками. Он гарантирует
совместимость при работе с библиотекой визуальных компонентов (CLX) Kylix.
Вообще, при создании многопоточных
приложений необходимо следовать приведенным ниже рекомендациям:
Определение объекта TThread
находится в модуле Classes
и имеет вид, приведенный в листинге
14.1.
Листинг 14.1. Объект
TThred
TThread = class privateИз вышеприведенного листинга можно определить, что объект
FHandle: THandle; FThreadID: THandle;
FTerminated: Boolean; FSuspended: Boolean; FFreeOnTerminate: Boolean; FFinished: Boolean; FReturnValue: Integer;
FOnTerminate: TNotifyEvent;
FMethod: TThreadMethod;
FSynchronizeException: TObject; procedure CallOnTerminate; function GetPriority: TThreadPriority; procedure SetPriority (Value: TThreadPriority); procedure SetSuspended (Value: Boolean); protected procedure DoTerminate; virtual;
procedure Execute; virtual; abstract;
procedure Synchronize(Method: TThreadMethod);
property ReturnValue: Integer read FReturnValue write FReturnValue; property Terminated: Boolean read FTerminated; public
constructor Greate(GreateSuspended: Boolean); destructor Destroy; override; procedure Resume; procedure Suspend; procedure Terminate;
function WaitFor: LongWord;
property FreeOnTerminate: Boolean read FFreeOnTerminate write FFreeOnTerminate;
property Handle: THandle read FHandle;
property Priority: TThreadPriority read GetPriority write SetPriority;
end;
property Suspended: Boolean read FSuspended write SetSuspended; property ThreadID: THandle read FThreadID;
property OnTerminate: TNotifyEvent read FOnTerminate write FOnTerminate;
TThread
является прямым потомком объекта
TObject
, следовательно, он не является визуальным компонентом. Его
метод Execute
— абстрактный. Поэтому сам объект TThread
тоже является абстрактным, и вы не сможете создать экземпляр этого класса.
Таким образом, вам придется создавать классы — потомки данного класса для работы
с потоками. Для создания потомка класса
TThread
выберите в главном меню Kylix команду File/New, затем
в появившемся окне (рис. 14.1) выберите пиктограмму Thread Object.
Рис.
14.1. Добавление объекта потока в проект с помощью диалогового окна New Items
В появившемся диалоговом
окне напишите имя для вашего нового объекта потока. После всего этого Kylix
создаст новый модуль и в окне редактора кода появится новая закладка.
Примечание
В отличие от большинства диалоговых окон IDE Kylix, которые требуют ввода имени класса, диалоговое окно создания нового объекта потока не добавляет автоматически букву "
T
" перед названием нового класса потока Поэтому желательно самостоятельно правильно называть новые потоки, напримерTMyThread.
Если вы проделали все вышеописанное
и назвали новый объект потока TMyThread
, то в новом модуле, сгенерированном
Kylix, вы можете увидеть код — заготовку для вашего нового объекта потока (листинг
14.2).
Листинг 14.2. Заготовка
для ноиого объукта потока
unit Unit1; interface
uses Classes;
type
TMyThread = class(TThread) private
{ Private declarations }
protected
procedure Execute; override;
end;
implementation
{ Важно: Методы и свойства объектов CLX могут быть использованы только
с помощью вызова метода синхронизации, например
Synchronize(UpdateCaption); и UpdateCaption должно выглядеть следующем образом:
procedure TMyThzead.UpdateCaption;
begin
Form1.Caption := 'Обновлено внутри потока'; end; }
{ TMyThread }
procedure TMyThread.Execute; begin
{ Разместите код потока здесь } end;
end.
В автоматически сгенерированном файле, модуля вы можете:
Execute
объекта потока, разместив там функции и процедуры;FreeOnTerminate: =True
;).