Обработка устройства ввода в компьютерной графике
Устройство, с помощью которого пользователь может передавать компьютеру данные, информацию или управляющие сигналы, называется устройством ввода. Центральный процессор компьютера (ЦП) принимает и обрабатывает данные для создания выходных данных. Например, световое перо, клавиатура и т. д. являются примерами устройств ввода, управляемых событиями.
Обработка устройств, управляемых событиями: Обработка устройств, управляемых событиями, может осуществляться двумя способами:
- Начните с входа в цикл опроса, который проверяет состояние устройства до тех пор, пока не будет сообщено о событии. Когда происходит событие, цикл завершается с результатами события. В языках высокого уровня чтение ввода терминала часто обрабатывается таким образом. Одним из недостатков этого метода является то, что ЦП часто простаивает, ожидая, что что-то произойдет.
- Разрешение прерываний, которые передаются устройством при возникновении события, является еще одним вариантом. Используя механизм прерывания, процессор может выполнять некоторые другие операции, ожидая возникновения события.
Алгоритмы обработки устройств ввода: система служит интерфейсом между пользовательскими программами, зависящими от устройства, и доступным устройством. Внутренняя часть интерфейсных процедур будет различаться в зависимости от устройства, в то время как внешняя часть , которую видят пользователи, останется неизменной. Это замечательно для пользователей, но сложно для нас, потому что мы не можем просто предоставить алгоритм.
Рассмотрим различные типы процедур, которые можно использовать для обработки устройств ввода. Рассмотрим классы устройств.
- Кнопка-
При нажатии кнопка является управляемым событием устройством, которое отправляет прерывание. Это только передает тот факт, что это было нажато как информация. - Выбирать-
Он обозначен пером. Это управляемое событиями устройство, которое выбирает некоторую часть дисплея. - Клавиатура-
Для имитации клавиатуры внутренняя форма подпрограмм впоследствии изменяется по сравнению с общим случаем. Это из-за 2 факторов. Во-первых, ввод с клавиатуры с помощью языка высокого уровня выглядит сэмплированным, а не механизмом, управляемым событиями. - локатор-
Локатор — это выборочное устройство, которое возвращает координаты некоторой позиции. - Оценщик-
Оценщик — это выборочное устройство, очень похожее на локатор, но возвращающее только одно значение. Это может быть двойная кнопка или ручка, которую может установить пользователь.
Предположим, что каждое устройство имеет средства для его включения или отключения, и упростим эту процедуру, создав флаг для каждого класса, а не включая и отключая отдельные устройства. Флаги (установлены или не установлены) определяют, включен ли конкретный класс. Чтобы упростить определение классов, дайте им числовые имена.
1. Подпрограмма для включения класса Button:
BEGIN
If Class = 1 Then
BEGIN
// Perform all the operations needed to permit
// input from the button devices
Button <-- True
END;
If Class = 2 Then
BEGIN
// Perform all the operations needed to permit
// input from the pick devices
Pick <-- True
END;
If Class = 3 Then
BEGIN
// Perform all the operations needed to permit
// input from the keyboard
Keyboard <-- True
END;
If Class = 4 Then
BEGIN
// Perform all the operations needed to permit
// input from the Loactor devices
Loactor <-- True
END;
If Class = 5 Then
BEGIN
// Perform all the operations needed to permit
// input from the valuator devices
Valuator <-- True
END;
AND so on
.
.
.
RETURN;
END;2. Подпрограмма для отключения класса Button:
BEGIN
If Class = 1 Then
BEGIN
// Perform all the operations needed to prohibit
// input from the button devices
Button <-- False
END;
If Class = 2 Then
BEGIN
// Perform all the operations needed to prohibit
// input from the pick devices
Pick <-- False
END;
If Class = 3 Then
BEGIN
// Perform all the operations needed to prohibit
// input from the keyboard
Keyboard <-- False
END;
If Class = 4 Then
BEGIN
// Perform all the operations needed to prohibit
// input from the Loactor devices
Loactor <-- False
END;
If Class = 5 Then
BEGIN
// Perform all the operations needed to prohibit
// input from the valuator devices
Valuator <-- False
END;
And so on
.
.
.
RETURN;
END;Для отключения подпрограмма принимает номер класса в качестве входных данных и выполняет любые операции, необходимые для логического отключения этого класса устройств и изменения соответствующего флага устройства на false. Точно так же подпрограмма включения принимает номер класса, выполняет необходимые операции для логического включения устройств и устанавливает флаг соответствующего устройства в значение true.
3. Процедура отключения всех устройств ввода:
BEGIN
For Class = 1 to 5
Do disable button(Class);
// calling routine 2 Above
RETURN;
END;Для обработки событий: прерывание генерируется устройством, управляемым событием. Процессор останавливает свою текущую работу всякий раз, когда происходит прерывание. Процессор выполняет процедуру обслуживания прерывания для устройства, сгенерировавшего прерывание. После обслуживания устройства процессор возобновляет свою старую работу.
Здесь предположим одну очередь событий, но очередей может быть несколько. Смысл предоставления услуги (процессором) состоит в том, чтобы идентифицировать устройство, вызвавшее прерывание, и получить от него входные данные. После получения этой информации она сохраняется в очереди событий.
Очередь работает по принципу « первым пришел – первым обслужен». Каждый элемент очереди представляет действие пользователя или событие. В очереди вставка выполняется в конце, а удаление — в начале.
1. Алгоритм обработки прерывания устройства ввода:
BEGIN
Disable Physical Interrupt;
Save Status Of CPU ;
Identify Interrupt Causing Device;
If the device is logically enabled, Then
BEGIN
If event from a string Input Devivce, Then
BEGIN
Get the input string;
// Add string to the queue, Described in
// the next algorithm
ADD_STRING_Q(STRING, DATA);
END
Else
BEGIN
Get the data from the device;
// Add string to the queue, Described in
// the next algorithm
ADD_EVENT_Q(CLASS, NUMBER, DATA);
END
END
Restore the status of processor;
Renable the physical Interrupt;
RETURN
END2. Алгоритм добавления события в очередь:
Этот алгоритм использует функцию-
ADD_EVENT_Q(CLASS, NUMBER, DATA)
BEGIN
If Qrear = Qsize, Then
Qrear <- 1
Else
Qrear <- Qrear + 1;
If Qfront = Qrear, Then
Return error - " Event Queue - overflow"
// Add class of the input device to the event
// queue class array at rear position
EVENT_QC[Qrear] <- Class;
// Add the number of the input device to the
// event queue number array at rear position
EVENT_QN[Qrear] <- Number;
// Add data from the input device to the event
// queue data array at rear position
EVENT_QD[Qrear] <- Data;
If QFront <- 0, Then
QFront <- 1;
RETURN ;
END;В очереди строк каждая новая строка добавляется в массив строк. Достигнув конца массива, вернитесь в переднее положение. Используется следующая функция:
ADD_STRING_Q(STRING, DATA)
BEGIN
If SQrear = SQsize, Then
SQrear <- 1
Else
SQrear <- SQrear + 1
// Add String from the input device to the
// String queue data array at rear position
STRING_Q[SQrear] <- String;
Data <- SQrear
RETURN;
END;Если не происходит никаких событий или не генерируется прерывание, а очереди остаются пустыми.