Обработка устройства ввода в компьютерной графике
Устройство, с помощью которого пользователь может передавать компьютеру данные, информацию или управляющие сигналы, называется устройством ввода. Центральный процессор компьютера (ЦП) принимает и обрабатывает данные для создания выходных данных. Например, световое перо, клавиатура и т. д. являются примерами устройств ввода, управляемых событиями.
Обработка устройств, управляемых событиями: Обработка устройств, управляемых событиями, может осуществляться двумя способами:
- Начните с входа в цикл опроса, который проверяет состояние устройства до тех пор, пока не будет сообщено о событии. Когда происходит событие, цикл завершается с результатами события. В языках высокого уровня чтение ввода терминала часто обрабатывается таким образом. Одним из недостатков этого метода является то, что ЦП часто простаивает, ожидая, что что-то произойдет.
- Разрешение прерываний, которые передаются устройством при возникновении события, является еще одним вариантом. Используя механизм прерывания, процессор может выполнять некоторые другие операции, ожидая возникновения события.
Алгоритмы обработки устройств ввода: система служит интерфейсом между пользовательскими программами, зависящими от устройства, и доступным устройством. Внутренняя часть интерфейсных процедур будет различаться в зависимости от устройства, в то время как внешняя часть , которую видят пользователи, останется неизменной. Это замечательно для пользователей, но сложно для нас, потому что мы не можем просто предоставить алгоритм.
Рассмотрим различные типы процедур, которые можно использовать для обработки устройств ввода. Рассмотрим классы устройств.
- Кнопка-
При нажатии кнопка является управляемым событием устройством, которое отправляет прерывание. Это только передает тот факт, что это было нажато как информация. - Выбирать-
Он обозначен пером. Это управляемое событиями устройство, которое выбирает некоторую часть дисплея. - Клавиатура-
Для имитации клавиатуры внутренняя форма подпрограмм впоследствии изменяется по сравнению с общим случаем. Это из-за 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 END
2. Алгоритм добавления события в очередь:
Этот алгоритм использует функцию-
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;
Если не происходит никаких событий или не генерируется прерывание, а очереди остаются пустыми.