Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_7 DELPHI_СПО.doc
Скачиваний:
3
Добавлен:
16.07.2019
Размер:
95.23 Кб
Скачать

8

Системное программное обеспечение

      

Лабораторная работа №7

Проектирование параллельных взаимодействующих вычислительных процессов

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

Создание многозадачных приложений с помощью системы программирования Delphi - общие сведения

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

  1. каждый тред имеет свою, при необходимости уникальную, исполняемую часть;

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

  3. диспетчеризация выполнения тредов осуществляется ОС и не требует вмешательства программиста;

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

Постановка задачи

  1. необходимо создать многопоточное приложение в соответствие со схемой взаимодействия отдельных потоков (в соответствием с вариантом рис. 1).

  2. Процесс А после своего завершения запускает задачи D, C и E.

  3. Задачи B, D и C завершаются примерно в одинаковое время.

  4. Поток F будет запускаться тем из тредов, который завершится первым, но только после завершения двух оставшихся тредов, приходящих в точку синхронизации 1.

  5. Пусть задача G запускается последним закончившим работу потоком E или F.

  6. Все указанные задачи должны быть созданы как потомки объекта TThread.

Методика решения задачи

  1. Базовый объект TThreadProgress является потомком объекта TThread и имеет следующие поля:

  1. имя;

  2. строка состояния;

  3. время работы в отсутствие конкурентов;

  4. текущее состояние;

  5. признак завершения;

  6. имя запустившего треда;

  7. строка для вывода сообщений в компонент TMemo.

  1. Поля базового объекта:

  1. исполняемая часть;

  2. завершающая часть;

  1. процедура прорисовки строки состояния;

  2. процедура вывода сообщения;

  1. Цикл задержки имитирует выполнение полезной работы.

  2. Процедура завершения выполняет соответствующие действия.

  3. Все задачи инициализируются одновременно, но в режиме ожидания запуска.

  4. Информация о завершении того или иного потока находится в соответствующем поле.

  5. Задача, запускающая другую задачу передает ей свое имя, обращаясь непосредственно к полю этого объекта (при многозадачности возникает критическая ситуация, когда несколько задач обращаются к общим ресурсам одновременно).

  6. Каждый процесс имеет связь с видимыми компонентами (VCL-объектами) (строка состояния и текстовое сообщение), но доступ к ним синхронизирован.

  7. Организация взаимного исключения основана на использовании метода критической секции с помощью объекта TCriticalSection:

  1. участок кода каждого потока, в котором производится обращение к общему ресурсу, заключается в скобки критической секции – используются методы Enter и Leave;

  2. если какой – либо тред уже находится внутри критической секции, то другой поток, который дошел до «открывающей скобки» Enter, не имеет права входить в критическую секцию до тех пор, пока первый поток находится в ней; когда первый тред выйдет из критической секции, второй сможет войти в нее и обратиться к критическому ресурсу.