- •Windows -приложение
- •Среда программирования
- •Встроенный отладчик
- •Использование графики
- •Графические данные и палитра
- •Сохранение проекта
- •Структура приложения
- •Структура модуля
- •Простые типы
- •Символьные типы
- •Логические типы
- •Тип перечень
- •Составной оператор
- •Оператор if
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла repeat
- •Пример приложения 6
- •Пример приложения 7
- •Статические массивы
- •Динамические массивы
- •Оператор with
- •Идентичность типов
- •Совместимость типов
- •Преобразование типов
- •Операторы обработки исключительных ситуаций
- •Рекурсия
- •Процедура exit
- •Директивы подпрограммы
- •Класс как объектный тип
- •Наследование
- •Операции is и as
- •Типы ссылки на класс
- •Типизированные файлы
- •Файлы без типа
- •Пример приложения 17
- •Компонент tmainmenii
- •Двунаправленные списки
- •Потоки данных
- •Пример приложения 22
- •Интерфейс drag and drop
- •Пример приложения 24
- •С файлами
- •Пример приложения 26
- •Программные потоки
- •Приоритеты потоков
- •Класс tthread
- •Проблемы синхронизации потоков
Программные потоки
Программные потоки {подзадачи, нити, Threads) - мощный инструмент, когда приложению необходимо выполнять сразу несколько действий (по крайней мере, они создают иллюзию одновременного выполнения нескольких операций). Если задачу приложения можно разделить на различные блоки: ввод или вывод, связь, обработка некоторых особых событий и т.д., то потоки могут быть органично встроены в программные решения. Сделав приложение многопоточным, можно получить дополнительные воз-
212
можности управления с помощью изменения приоритетов потоков или, например, снять большую нагрузку на приложение, распределив ее между потоками.
Потоки в полной мере эксплуатируют операционную систему. Например, летяшие листы бумаги, которые мы видим, когда копируется файл, отображаются на экране, благодаря активной подзадаче, в то время как основной процесс занят копированием данных. На самом деле операционная система (если не используется многопроцессорные компьютеры) "героически разрывается" между различными процессами и подзадачами, периодически приостанавливая одну выполняемую задачу и переходя к следующей в вечно крутящейся карусели. Таким образом, поток - это объект, созданный внутри процесса и получающий время процессора, которое выделяется квантами.
Когда Windows загружает программу, строится процесс, для которого создается хотя бы один поток, чтобы запустить программный код. Процессы определяют данные, ресурсы, адресное пространство и пространство виртуальных адресов. Потоки, работающие в данном процессе, используют все ресурсы, предоставленные процессу операционной системой, и отвечают за выполнение кода. Потоки подразделяются на симметричные (они имеют одинаковое предназначение, исполняют один и тот же код и могут разделять одни и те же ресурсы) и асимметричные (решающие различные задачи и, как правило, не разделяющие совместные ресурсы).
Приоритеты потоков
Итак, каждый поток выполняется во всем выделенном пространстве памяти процесса. Таким образом, все подзадачи приложения могут видеть и изменять все глобальные данные. Поэтому при наличии нескольких потоков необходимо позаботиться о синхронизации их работы, так как операционная система выполняет переключения между подзадачами и основным процессом, выделяя, чаще всего, для них различное количество процессорного времени. Количеством выделяемого процессорного времени можно управлять с помощью назначаемых приоритетов.
Операционная система может назначать приоритеты в соответствии со своими установками, или можно задать нужный приоритет, используя специальные системные подпрограммы (например, SetPriorityClass). Система при выполнении приложения будет расставлять подзадачи в соответствии с их приоритетом и в том случае, когда нет доступных для выполнения подзадач с высоким приоритетом, выполняются подзадачи с приоритетом более низкого уровня. Если несколько подзадач имеют один и тот же уровень приоритета, то они расставляются системой и выполняются одна за другой по кругу.
Приоритеты присваиваются отдельно процессам и каждому включенному в процесс потоку. Приоритет, устанавливаемый для процесса, известен
213
как базовый (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, нужно иметь очень веские основания, иначе другие процессы в системе могут не получить достаточного процессорного времени.