Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив1 / docx54 / Курсовая работа - Силина.docx
Скачиваний:
64
Добавлен:
01.08.2013
Размер:
155.16 Кб
Скачать

1.4 Постановка задания

Разработать программное обеспечение для регулирования движения моделей поездов по рельсам через перекрёстки. Количество поездов задаче – два. Траектория движения каждого поезда – окружность. Две окружности пересекаются в двух точках, называемых перекрёстками. На каждом перекрёстке установлен железнодорожный семафор, который позволяет только одному поезду въехать на перекрёсток.

Для решения задачи была использована среда программирования – Delphi 7. При выводе визуализации использовалась библиотека OpenGL.

1.5 Подход к решению задачи

При решении поставленной задачи использовался следующий алгоритм:

Вся графическая визуализация выполнялась средствами OpenGL, математическая же составляющая визуализации – это координаты паровозов (Т1 и Т2) и их длин в вагонах (tVansCount1 и tVansCount2) и градусах окружности (tLength1 и tLength2). При помощи этих параметров однозначно определяется положение того или иного поезда в определённый момент времени. Существует два поезда и для каждого создан свой поток (CreateThread). Как только любой из поездов приближаетсяся к "зоне семафора", программа синхронизирует потоки и проверяет этот семафор на занятость (WaitForSingleObject) и, если он не занят, пропускает поезд на перекрёсток и занимает семафор (CreateSemaphore). В противном случае движение поезда останавливается до освобождения семафора (WaitForSingleObject). После окончания движения поезда по переезду ("зона семафора" находится вне градусных мер начала и конца поезда) семафор освобождается (ReleaseSemaphore) и движение поездов возобновляется.

2. Использованные api-функции

В работе использовались следующие API-функции:

CreateSemaphore – создание семафора

function CreateSemaphore (flpSemaphoreAttributes: PSecurityAttributes; llnitialCoimt,iMaximumCount: Longint; IpName: PChar): THandle; stdcall;

  • flpSemaphoreAttributes – указатель на запись TSecurityAttributes, значение Nil соответствует согласию на использование стандартных атрибутов защиты.

  • llnitialCount представляет собой начальное значение счетчика семафорного объекта. Это число может находиться в диапазоне от 0 до значения IMaximumCount. Семафор доступен, если значение этого параметра больше нуля. Когда поток вызывает функцию WaitForSingleObject() любую другую, ей подобную, значение счетчика семафора уменьшается на единицу. И наоборот, при вызове потоком функции ReleaseSemaphore() значение счетчика семафора увеличивается на единицу.

  • IMaximumCount задает максимальное значение счетчика сема¬форного объекта. Если семафор используется для подсчета некоторых ресурсов, это число должно представлять общее количество доступных ресурсов.

  • IpName содержит имя семафора.

ReleaseSemaphore - увеличения значения счетчика семафора

function ReleaseSemaphore(hSemaphore: THandle; IReleaseCount: Longint; IpPreviousCount: Pointer): BOOL; stdcall;

  • IReleaseCount задаёт число, на которое будет уменьшено значение счетчика семафора. При этом старое значение счетчика будет сохранено в переменной типа Longint, на которую указывает параметр IpPreviousCount, если его значение не равно Nil,

CloseHandle – закрытие дескриптора

function CloseHandle(hObject: THandle): BOOL; stdcall;

function CloseHandle; external kernel32 name 'CloseHandle';

  • HObject – дескриптор объекта

WaitForSingleObject – приостановка выполнения потока до того момента, как заданный объект перейдет в состояние свободно.

function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; stdcall;

function WaitForSingleObject; external kernel32 name 'WaitForSingleObject';

  • hHandle - дескриптор объекта, уведомление о свободном состоянии которого требуется получить

  • dwMilliseconds - это время, которое вызывающий поток готов ждать. Если dwMilliseconds равно нулю, функция немедленно вернет текущий статус заданного объекта. Таким образом, можно протестировать состояние объекта. Параметру можно также присваивать значение символьной константы INFINITE (= -1), в этом случае вызывающий поток будет ждать неограниченное время.

Функция WaitForSingleObject переводит вызывающий поток в состояние ожидания до того момента, когда она передаст ему свое возвращаемое значение. Возвращаемые значения:

• WAIT_OBJECT_0 - объект находится в состоянии «свободно»;

• WAIT_TIMEOUT - интервал ожидания, заданный dwMilliseconds, истек, а нужный объект по прежнему находится в состоянии «занято»;

• WAIT_ABANDONED относится только к мьютексу и означает, что объект небыл освобожден потоком, который владел им до своего завершения;

• WAIT_FAILED - при выполнении функции произошла ошибка.

CreateThread – создание потока.

function CreateThread (psa: PSecurityAttributes; cbStackSize:DWORD, pfnStartAddr: PTHREAD_START_ROUTIME, pvParam: PVOID, dwCreateFlags: DWORD, pdwThreadID: PDWORD): THandle; stdcall;

  • psa – Параметр psa является указателем на структуру SECURITY_ATTRIBUTES (аттрибуты защиты)

  • cbStackSize - Этот параметр определяет, какую часть адресного пространства поток сможет использовать под свой стек.

  • pfnStartAddr - определяет адрес функции потока, с которой должен будет начать работу создаваемый поток

  • pvParam – указатель на параметр функции pfnStartAddr.

  • dwCreateFlags - Этот параметр определяет дополнительные флаги, управляющие созданием потока. Он принимает одно из двух значений: 0 (исполнение потока начинается немедленно) или CREATE_SUSPENDED.

  • pdwThreadID - это адрес переменной типа DWORD, в которой функция возвращает идентификатор, приписанный системой новому потоку.

При каждом вызове функции CreateThread система создает объект ядра «поток». Это не сам поток, а компактная структура данных, которая используется операционной системой для управления потоком и хранит статистическую информацию о потоке.

Соседние файлы в папке docx54