Лабораторная работа №2. Использование потоков в среде Delphi
Цель работы: изучить работу с классом TThread в среде программирования Delphi и научиться разрабатывать многопоточные приложения.
Методические указания к лабораторной работе:
Потоки — это объекты, получающие время процессора. Время обычно выделяется квантами. Квант времени — это интервал, имеющийся в распоряжении потока до тех пор, пока время не будет у него отобрано и передано в распоряжение другого потока.
Нужно иметь в виду, что кванты выделяются не программам или процессам, а порожденным ими потокам. Как минимум, каждый процесс имеет хотя бы один поток, но Windows 95 и Windows NT позволяют запустить в рамках процесса сколько угодно потоков.
Потоки дают современному программному обеспечению новые специфические возможности. К примеру, Excel и Word задействуют по несколько потоков. Word может одновременно корректировать грамматику и печатать, при этом осуществляя ввод данных с клавиатуры и мыши; программа Excel способна производить фоновые вычисления и печатать. Потоки упрощают жизнь тем программистам, которые разрабатывают приложения в архитектуре клиент/сервер. В момент, когда требуется обслуживание нового клиента, сервер может запустить специально для этого отдельный поток.
Существует два главных типа потоков — асимметричные и симметричные. Чаще всего на персональных компьютерах используют асимметричные потоки.
Асимметричные потоки (Asymmetric threads) — это потоки, решающие различные задачи и, как правило, не разделяющие ресурсы. Один из таких потоков отвечает за печать; другой обрабатывает сообщения от клавиатуры и мыши; третий заведует автоматическим сохранением документа пользователя.
Симметричные потоки (Symmetric threads) выполняют одну и ту же работу, разделяют одни ресурсы и исполняют один код. Пример приложения с симметричными потоками — электронные доски объявлений (Bulletin Board Systems, BBS). Для каждого звонящего туда BBS запускает новый поток для обслуживания пользователя. К приложению можно добавлять новые симметричные потоки по мере возрастания нагрузки.
Обзор класса tThread в Delphi
Delphi представляет программисту полный доступ к возможностям программирования интерфейса Win32 – класс TThread. Класс TThread — это прекрасный пример предоставления разработчику простого доступа к программированию потоков. Другая отличительная черта класса TThread — это гарантия совместимости с библиотекой визуальных компонентов VCL. Без использования класса TThread во время вызовов VCL могут произойти ситуации гонок.
Рассмотрим некоторые свойства, методы и события класса TThread.
Свойства |
|
Методы |
|
События |
FreeOnTerminate - освобождать ли память, выделенную под экземпляр класса процесса, когда этот процесс завершается. Если True - при завершении процесса (или при вызове метода Terminate) экземпляр класса автоматически освобождается (аналогично вызову метода Free). Тип: Boolean; Handle (ThreadID) - дескриптор процесса. Эта величина может быть использована для управления процессом через функции WinAPI. Тип: THandle; ReturnValue - возвращаемое значение при завершении процесса. Тип: Integer; Priority - приоритет процесса. Возможные значения этого свойства мы разберем немного позже. Тип: TThreadPriority; Suspended - показывает, в каком состоянии находится процесс: True - приостановлен, False - в нормальном. Тип: Boolean; Terminated - показывает, завершен ли процесс. True - завершен, False - нет. Тип: Boolean; |
|
Create(CreateSuspended: Boolean) - создает экземпляр класса. Параметр CreateSuspended указывает на то, нужно ли создавать приостановленную задачу (True), или запускать ее сразу (False); Suspend - приостанавливает выполнение процесса; Resume - продолжает выполнение процесса после Suspend; Terminate - полностью прекращает выполнение процесса; WaitFor - ждет завершения процесса, возвращая затем код его завершения (ReturnValue); Synchronize(Method: TThreadMethod) - синхронизирует выполнение метода процесса, позволяя ему работать параллельно с другими процессами. |
|
OnTerminate - возникает, когда процесс находится в стадии завершения. |