Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка DELPHI.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

Программные потоки

Программные потоки (подзадачи, нити, Threads) – мощный инструмент, когда приложению необходимо выполнять сразу несколько действий (по крайней мере, они создают иллюзию одновременного выполнения нескольких операций). Если задачу приложения можно разделить на различные блоки: ввод или вывод, связь, обработка некоторых особых событий и т.д., то потоки могут быть органично встроены в программные решения. Сделав приложение многопоточным, можно получить дополнительные возможности управления с помощью изменения приоритетов потоков или, например, снять большую нагрузку на приложение, распределив ее между потоками.

Потоки в полной мере эксплуатируют операционную систему. Например, летяшие листы бумаги, которые мы видим, когда копируется файл, отображаются на экране, благодаря активной подзадаче, в то время как основной процесс занят копированием данных. На самом деле операционная система (если не используется многопроцессорные компьюторы) героически разрывается между различными процессами и подзадачами, периодически приостанавливая одну выполняемую задачу и переходя к следующей в вечно крутящейся карусели. Таким образом, поток – это объект, созданный внутри процесса и получающий время процессора, которое выделяется квантами.

Когда Windows загружает программу, строится процесс, для которого создается хотя бы один поток, чтобы запустить программный код. Процессы определяют данные, ресурсы, адресное пространство и пространство виртуальных адресов. Потоки, работающие в данном процессе, используют все ресурсы, предоставленные процессу операционной системой, и отвечают за выполнение кода. Потоки подразделяются на симметричные (они имеют одинаковое предназначение, исполняют один и тот же код и могут разделять одни и те же ресурсы) и асимметричные (решающие различные задачи и, как правило, не разделяющие совместные ресурсы).

Приоритеты потоков

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

Операционная система может назначать приоритеты в соответствии со своими установками, или можно задать нужный приоритет, используя специальные системные подпрограммы (например, SetPriorityClass). Система при выполнении приложения будет расставлять подзадачи в соответствии с их приоритетом и в том случае, когда нет доступных для выполнения подзадач с высоким приоритетом, выполняются подзадачи с приоритетом более низкого уровня. Если несколько подзадач имеют один итот же уровень приоритета, то они расставляются системой и выполняются одна за другой по кругу.

Приоритеты присваиваются отдельно процессам и каждому включенному в процесс потоку. Приоритет, устанавливаемый для процесса, известен как базовый приоритет (base priority). Базовый приоритет может изменяться от 0 до 31. Для потоков можно использовать приоритеты от 0 до 15, если процесс не имеет приоритета REALTIME_PRIORITY_CLASS. В табл. 16 приводятся основные сведения по приоритетам прцессов.

Таблица 16

Основные приоритеты (базовые), устанавливаемые для процессов

Класс приоритета

Наименование

Основной приоритет

IDLE_PRIORITY_CLASS

Пассивный (фоновый)

4

NORMAL_PRIORITY_CLASS

Нормальный

7 (фоновый) или 9 (переднего плана)

HIGH_PRIORITY_CLASS

Высокий

13

REALTIME_PRIORITY_CLASS

Реального времени

24

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