Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 8 .Потоки.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
269.82 Кб
Скачать

Простейший поток

Для создания дополнительного потока в программах Delphi предназначен специальный модуль потока в репозитории (File\New\Other…) он обозначен пиктограммой Thread Object

При выборе этого модуля Delphi запрашивает имя класса, который будет дочерним для основополагающего класса TThread.

Необходимость наследования связана с тем, что класс TThread содержит абстрактный метод Execute, который, собственно, и должен исполняться в рамках нового потока и который, следовательно, обязан перекрываться в потомках.

После указания имени дочернего класса Delphi раскрывает дополнительный модуль с обширным комментарием и заготовкой для дочернего класса.

{Важно: Методы и свойства объектов из библиотеки визуальных компонентов могут использоваться только в рамках вызова метода Synchronize, например:

Synchronize(UpdateCaption);

где метод UpdateCaption должен быть подобен такому

procedure MyThread.UpdateCaption;

begin

Form1.Caption := 'Новый текст метки';

end; }

{MyThread }

procedure MyThread.Execute;

begin

{Пожалуйста, поместите код потока в этом месте}

end;

end.

Программирование потока ничем не отличается от программирования обычной программы за одним важным исключением:

поток не должен использовать методы и свойства визуальных компонентов, которые приводят к изменению внешнего вида программы.

Точнее, он может это делать только при обращении к специальному методу Synchronize, с помощью которого осуществляется синхронизация исполнения главного потока программы с дополнительным потоком.

Класс TThread содержит метод Execute, который описан следующим образом:

procedure Execute; virtual; abstract;

Это и есть код, исполняемый в создаваемом потоке TThread.

Примечание

Хотя формальное описание Execute — метод abstract, но мастер создания нового объекта TThread создает пустой шаблон этого метода.

Переопределяя метод Execute, можно тем самым закладывать в новый потоковый класс то, что будет выполняться при его запуске.

Если поток был создан с аргументом

CreateSuspended1:= False,

то метод Execute выполняется немедленно,

в противном случае Execute выполняется после вызова метода Resume.

Если поток рассчитан на однократное выполнение каких-либо действий, то никакого специального кода завершения внутри Execute писать не надо.

Если же в потоке будет выполняться какой-то цикл, и поток должен завершиться вместе с приложением, то условия окончания цикла должны быть примерно такими:

procedure TMyThread.Execute;

begin

repeat

DoSomething; // что-то выполняется

Until CancelCondition or Terminated;

end;

Здесь CancelCondition —личное пользовательское условие завершения потока (исчерпание данных, окончание вычислений, поступление на вход того или иного символа и т. д.),

свойство Terminated сообщает о завершении потока (это свойство может быть установлено как изнутри потока, так и извне; чаще всего, завершается породивший его процесс).

Конструктор объекта:

constructor Create (CreateSuspended: Boolean);

получает параметр CreateSuspended. Если его значение равно True, вновь созданный поток не начинает выполняться до тех пор, пока не будет сделан вызов метода Resume.

В случае если параметр CreateSuspended имеет значение False, конструктор завершается и только затем поток начинает исполнение.

destructor Destroy; override;

Деструктор Destroy вызывается, когда необходимость в созданном потоке отпадает. Деструктор завершает его и высвобождает все ресурсы, связанные с объектом TThread.

function Terminate: Integer;

Для окончательного завершения потока (без последующего запуска) существует метод Terminate. Этот метод не делает никаких принудительных действий по остановке потока. Все, что происходит, — это установка свойства

property Terminated: Boolean;

в значение True.

Таким образом, Terminate — это указание потоку завершиться, выраженное "в мягкой форме", с возможностью корректно освободить ресурсы.

Если нужно немедленно завершить поток, лучше использовать функцию Windows API TerminateThread.