На этом шаге будут рассмотрены свойства и методы класса TThread.
Несмотря на то, что Delphi предоставляет программисту все возможности программирования средствами
Windows API, в библиотеке VCL имеется специальный
класс для реализации потоков - класс TThread. Для чего же потребовалось создавать этот класс?
Во-первых, класс TThread делает программирование потоков более удобным. Во-вторых, он обеспечивает
безопасную работу с VCL.
Свойства и методы класса TThread представлены в таблицах 1 и 2.
Таблица 1. Свойства класса TThread
Свойство | Описание |
---|---|
property FreeOnTerminate: Boolean; | Определяет, будет ли объект потока уничтожен автоматически при завершении потока. Если свойство равно True, то поток будет уничтожен автоматически при завершении, если свойство равно False, то поток должен уничтожаться явно в коде приложения. |
property Handle: THandle; | Содержит дескриптор потока. Используется для управления потоком с помощью функций Windows API. |
property Priority: TThreadPriority; | Определяет приоритет потока относительно других потоков в процессе. |
property ReturnValue: Integer; | Определяет значение, возвращаемое потоком при его завершении. |
property Suspended: Boolean; | Показывает, является ли поток приостановленным. Если установить свойство в True, то поток будет приостановлен, если установить свойство в False выполнение потока будет продолжено. |
property Terminated: Boolean; | Показывает, был ли произведен вызов метода Terminate. |
property ThreadID: THandle; | Идентифицирует поток в системе. |
Таблица 2. Методы класса TThread
Метод | Описание |
---|---|
constructor Create(CreateSuspended: Boolean); | Создает объект потока. Если параметр CreateSuspended равен False, то метод Execute будет вызван сразу. Если параметр CreateSuspended равен True, то метод Execute будет вызван только после вызова метода Resume. |
destructor Destroy; override; | Уничтожает объект потока и освобождает память, выделенную для него. |
procedure DoTerminate; virtual; | Вызывает событие OnTerminate. |
procedure Execute; virtual; abstract; | Абстрактный метод, содержащий код, который будет выполняться при запуске потока. |
procedure Resume; | Возобновляет выполнение приостановленного потока. |
procedure Suspend; | Приостанавливает выполнение потока. |
procedure Synchronize(Method: TThreadMethod); | Выполняет метод, вызванный в рамках главного VCL потока. |
procedure Terminate; | Дает потоку сигнал на завершение, устанавливая свойство Terminated в значение True. |
function WaitFor: LongWord; | Ожидает завершение потока и возвращает значение, определяемое свойством ReturnValue. |
Немного слов о методе Synchronize. Дело в том, что библиотека VCL не
защищена от потоков. Все пользовательские компоненты разрабатывались так,
что к ним может получить доступ только один поток. И если дополнительно
созданный поток и главный поток приложения будут пытаться одновременно,
например, вывести что-нибудь в одну область экрана или компонент, то это
может привести к ошибке или неадекватной работе приложения. Чтобы этого не произошло
и используется метод Synchronize. При его вызове поток останавливается,
и управление передается главному потоку, который выполняет процедуру, посланную
параметром в метод Synchronize.
Класс TThread имеет единственное событие - это событие OnTerminate.
property OnTerminate: TNotifyEvent;
- возникает после возврата из метода
Execute и перед уничтожением потока.
На следующем шаге мы изучим основные действия для создания потока.