Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уроки Delphi начинающим с нуля.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.32 Mб
Скачать

Потоки в Delphi Организация многопоточной работы в Delphi

   Потоки в Delphi выполняют функцию имитации псевдопараллельной работы приложения. Как известно, для организации многозадачности операционная система выделяет каждому приложению, выполняющемуся в настоящий момент, определённые кванты времени, длина и количество которых определяется его приоритетом. Поэтому объём работы, который приложение может выполнить, определяется тем, сколько таких квантов оно сможет получить в единицу времени. Для операционной системы каждый поток является самостоятельной задачей, которой выделяются кванты времени на общих основаниях. Поэтому приложение Delphi, умеющее создать несколько потоков, получит больше времени операционной системы, и соответственно сможет выполнить больший объём работы.    Создать дополнительный поток в Delphi поможет объект TThread. Ввести объект TThread в программу можно двумя способами:

  1. с помощью Мастера;

  2. вручную.

   1. Мастер создания дополнительного потока в Delphi создаёт отдельный модуль, в рамках которого выполняется поток. Выполним:    File -> New -> Other... В появившейся табличке выбора найдём TThread Object. Появится окошко, в верхнюю строку которого (Class Name) введём имя нашего будущего потока: MyThread. В результате будет создан модуль, содержащий заготовку кода, реализующего дополнительный поток Delphi:

unit Unit2; // Имя модуля, содержащего поток. При сохранении его можно изменить. interface uses   Classes; type   MyThread = class(TThread) //MyThread - заданное нами имя потока.   private     { Private declarations }   protected     procedure Execute; override;   end; implementation { Important: Methods and properties of objects in visual components can only be   used in a method called using Synchronize, for example,       Synchronize(UpdateCaption);   and UpdateCaption could look like,     procedure MyThread.UpdateCaption;     begin       Form1.Caption := 'Updated in a thread';     end; } { MyThread } procedure MyThread.Execute; begin   { Place thread code here } end; end.

   2. В первом способе класс MyThread был создан мастером в дополнительном модуле. Второй способ состоит в том, что мы сами создаём такой класс в рамках одного из уже существующих модулей программы, например, в модуле Unit1: unit Unit1; //Обычный модуль в котором описывается основная программа interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls; type   TForm1 = class(TForm)     Button1: TButton;     procedure Button1Click(Sender: TObject);   private     { Private declarations }   public     { Public declarations }   end; //Здесь необходимо описать класс TMyThread:   TMyThread = class(TThread)     private     { Private declarations }   protected     procedure Execute; override;   end; var   Form1: TForm1; //Нужно ввести переменную класса TMyThread   MyThread: TMyThread; implementation {$R *.dfm} //Нужно создать процедуру Execute, уже описанную в классе TMyThread procedure TMyThread.Execute; begin //Здесь описывается код, который будет выполняться в потоке end;

   Если поток создаётся мастером, т.е. в другом модуле, то не забудьте в основном модуле описать переменную - экземпляр потока, как указано выше. Также, поскольку класс потока описан в другом модуле, имя этого модуля необходимо добавить в секцию uses. Теперь можно запускать поток, даже если в его процедуре Execute нет ни единого оператора. //Запускать поток будем нажатием на кнопку: procedure TForm1.Button1Click(Sender: TObject); begin //Вначале нужно создать экземпляр потока:   MyThread:=TMyThread.Create(False); //Параметр False запускает поток сразу после создания, True - запуск впоследствии , методом Resume //Далее можно указать параметры потока, например приоритет:   MyThread.Priority:=tpNormal; end; end.