Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тurbo Pascal 7+.doc
Скачиваний:
12
Добавлен:
24.12.2018
Размер:
10.09 Mб
Скачать

10.8. Буфер клавиатуры

Предположим, вы играете в игру, где с клавиатуры управляете движением самолета. Чтобы избежать попадания вражеского снаряда, вы должны направить самолет вверх и направо, то есть очень быстро нажать клавишу ↑ и сразу затем клавишу →. Как только вы нажали на ↑ компьютер несколько долей секунды обрабатывает это нажатие, то есть соображает, что теперь ваш самолет нужно направить вверх. Если вы успели нажать на клавишу → до того, как он это сообразил, что компьютер, не имеющий буфера клавиатуры, просто не обратит внимания на это нажатие, потому что занят мыслительной работой. А это плохо, так как вы совершенно не обязаны во время игры думать о том, успевает ли компьютер за вашими пальцами.

Чтобы исправить ситуацию, нужно дать компьютеру возможность в случае занятости не игнорировать нажатия на клавиши, а запоминать их, чтобы обработать, как только освободится. Для этого и служит буфер клавиатуры - место в оперативной памяти, в котором и запоминаются эти нажатия. Вы можете, пока компьютер занят, нажать на клавиши до 16 раз - и буфер клавиатуры запомнит все 16 клавиш в том порядке, в котором они нажимались. Вот как можно изобразить процесс ввода в компьютер текста "Привет недоверчивым!", когда процессор занят:

На клавиши пока не нажимали:

Нажали на клавишу П:

Нажали еще на одну клавишу - р:

Нажали еще на несколько клавиш:

Нажали на клавиши в 15-й и 16-й раз:

Нажали на клавишу в 17-й раз - раздается предупреждающий писк компьютера, буква «в» в буфер не записывается:

Пока мы буфер клавиатуры только заполняли. А кто его очистит? Процессор. Процессор, выполняющий программу на Паскале, берет что-то из буфера клавиатуры только в тот момент, когда выполняет процедуру ReadLn, функцию ReadKey и еще кое что. В остальное время он для буфера клавиатуры занят. Посмотрим, как он берет информацию из буфера, выполняя ReadKey.

Пусть перед выполнением ReadKey в буфере была такая информация:

При выполнении ReadKey первая из введенных в буфер букв - П - отправляется на обработку:

Еще одно выполнение ReadKey:

Помните, что если вы нажали на какую-нибудь клавишу и не отпускаете ее, то это равносильно частому-частому нажатию на эту клавишу. Если процессор в это время не занят выполнением процедуры ReadLn или большого количества функций ReadKey, то некому выуживать информацию из буфера клавиатуры, он мгновенно переполняется и вы слышите раздраженный писк.

На практике события, описанные всеми этими схемами, встречаются редко. Только неопытный пользователь будет жать на клавиши в тот момент, когда компьютер не готов воспринимать информацию. Обычно подавляющую часть времени буфер клавиатуры пуст, ни процессор, ни клавиатура с ним не работают. Человек в нужный момент нажимает на клавишу, в буфере появляется символ, и тут же процессор при помощи ReadLn или ReadKey извлекает его оттуда, и снова надолго буфер пуст.

Теперь мы можем описать правила работы KeyPressed и ReadKey как надо:

Функция KeyPressed отвечает на вопрос, есть ли что-нибудь в буфере клавиатуры. В буфере клавиатуры она никаких изменений не производит.

Функция ReadKey забирает из буфера клавиатуры символ, который попал туда раньше других. Если буфер клавиатуры пуст, то ReadKey останавливает компьютер. Ожидание длится до тех пор, пока в буфере не появится символ (в результате нажатия на клавишу). ReadKey сразу же его оттуда забирает, и компьютер продолжает работу.

Теперь вам должно быть понятно, зачем мы в одной из предыдущих циклических программ использовали KeyPressed. Без нее ReadKey просто остановила бы компьютер.

ReadLn при своей работе опустошает буфер клавиатуры.

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

Как очистить буфер клавиатуры, не останавливая компьютер:

while KeyPressed do kl:=ReadKey

то есть "пока в буфере не пусто, извлекай из буфера по символу". Как ждать нажатия на произвольную клавишу:

repeat until KeyPressed

то есть "повторяй отвечать на вопросы, пока не нажмут на клавишу".

Задание 98

"Управляемая точка". Назначьте 4 клавиши. По нажатии одной из них точка по экрану перемещается на некоторый шаг вверх, другой - вниз, третьей - влево, четвертой - вправо.

В разделе 12.11 вы узнаете, как управлять компьютером при помощи клавиш управления курсором (←↑→↓) и других.

Задание 99

Добавьте еще пару клавиш - одну для увеличения шага, другую - для уменьшения.