Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая Вариант 18.docx
Скачиваний:
25
Добавлен:
17.06.2016
Размер:
188.59 Кб
Скачать

5. Программирование ввода и вывода

5.1. Пример использования системных функций для ввода

Требуется разработать прикладную программу, в которой для перемещения символа ‘*’ в пределах заданного на экране монитора прямоугольного окна необходимо использовать клавиши, обозначенные символами ←, ↑, →, ↓ (стрелки). Завершение программы осуществляется при нажатии клавиши ESC.

# include <dos.h>

# include <conio.h>

# include <stdio.h>

# define ESC 27

void main(void) {//объявление простых и структурных переменных

int x=10, y=20; //начальное положение курсора

union REGS in, out; // основной цикл программы, выход по ESC.

do {

gotoXY(x,y);

printf ("*\n");

while (out.h.al)= =0)

{

in.h.ah=0x07;

int86(0x21, &in, &out);

}

switch (out.h.al) // анализ позиции

{

case 77: if (x>30) {x=10; y++;}

else if ((x==30) && (y==40)) {x=10; y=20;}

else x++; break;

case 75: if (x<10) {x=30; y--;}

else if ((x==10) && (y==20)) {x=30; y=40;}

else x--; break;

case 80: if (y>40) {y=20; x++;}

else if ((y==40) && (y==30)) {x=10; y=20;}

else y++; break;

case 72: if (y<20) {y=40; x--;}

else if ((y==20) && (x==10)) {x=30; y=40;}

else y--; break;

}

delay(500); // задержка выполнения

}

while(out.h.al!=ESC);

} //конец программы.

Данная программа иллюстрируется взаимодействие клавиатуры с СРU с помощью системы прерываний. В программе пользователя осуществляется обращение к клавиатуре с помощью функций BIOS, DOS или функций языка высокого уровня (С, Pascal).

В данной программе реализованы следующие возможности взаимодействия ЭВМ с клавиатурой: ввод символов с устройства, отрисовка символа по запросу с устройства, задержка на реагирование запроса с устройства.

И демонстрируются функции взаимодействия:

  1. асинхронный ввод/вывод;

  2. идентификация клавиш (соединения сигнала с периферии с процессором);

  3. запись в буфер.

Для вызова функции DOS используется регистр АН, содержащий номер функции, и команда INT 21H. Результат выполнения функции DOS размещается в AL. В DOS каждая функция характеризуется тремя признаками:

  1. Функция либо ожидает ввода символа в буфер, либо сразу выдает сообщение о том, что буфер пуст;

  2. Функция либо выполняет эхопечать, либо эхопечать отсутствует;

  3. Функция либо может быть прерванной другими функциями, например, 1BH, 23H (Ctrl_Break), либо нет.

5.2. Общие сведения об интерфейсе Win32 api

Интерфейс программирования приложений, API – набор готовых классов, процедур, функций, структур и констант, предоставляемых приложением (библиотекой, сервисом, операционной системой) для использования во внешних программных продуктах. ОС Windows не дает прямой доступ к устройствам обычным программам, но множество системных функций позволяет использовать полный спектр возможностей устройств, причем программист не обязан знать ни внутреннюю структуру устройства ни непосредственные способы программирования этих устройств (в отличие от программирования устройств в DOS). Все 32-разрядные приложения Windows используют для взаимодействия с операционной системой, оборудованием и другими программами интерфейс Win32 API.

Win32 – 32-разрядный API для современных версий Windows. Базовые функции этого API реализованы в динамически подключаемых библиотеках kernel32.dll и advapi32.dll; базовые модули графического интерфейса пользователя – в user32.dll и gdi32.dll. Win32 появился вместе с Windows NT и затем был перенесён в несколько ограниченном виде в системы серии Windows 9x. В современных версиях Windows, происходящих от Windows NT, работу Win32 GUI обеспечивают два модуля: csrss.exe (процесс исполнения клиент-сервер), работающий в пользовательском режиме, и win32k.sys в режиме ядра. Работу же системных Win32 обеспечивает ядро – ntoskrnl.exe.

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

Среди функций Win32 API имеются: функции для работы с файловой системой, функции для построения пользовательского интерфейса, функции для работы с дополнительными устройствами (принтеры, звуковые карты и др.), функции для межпрограммного взаимодействия (посылка и прием сообщений), функции для работы с сетью, взаимодействие со встроенным программным обеспечением (файерволлы, виджеты, медиа плеер, поиск) и другие.

Например, существует функция CreateSemaphore, которая используется для запрета одновременного выполнения заданных участков кода и для поочерёдного доступа к критическому ресурсу (для которого невозможен одновременный доступ).

Параметры функции:

HANDLE CreateSemaphore

( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,

// атрибут доступа

LONG lInitialCount,

// инициализированное начальное состояние счетчика

LONG lMaximumCount,

// максимальное количество обращений

LPCTSTR lpName

// имя объекта);

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

BOOL ReleaseSemaphore

( HANDLE hSemaphore, // хенд семафора

LONG lReleaseCount, // на сколько изменять счетчик

LPLONG lpPreviousCount // предыдущее значение);

При успешном выполнении возвращаемое значение ненулевое. Для уничтожения семафора нужно вызвать CloseHandle().

В случае возвращения NULL последующим вызовом GetLastError можно выявить причину ошибки при исполнении.