Контекст
Если я правильно понял вопрос, вы пишете программу, которая будет работать под 16-битной MS-DOS, внутри DosBox. Ожидается, что эта программа будет реагировать как на ввод с помощью мыши, так и на клавиатуру. Он также может захотеть выполнить некоторые вычисления во время ожидания ввода.
Опрос
Самое простое и прямолинейное решение — использовать опрос, то есть вы сидите в цикле, спрашивая клавиатуру и мышь, есть ли у них новый ввод для ответа. В псевдокоде:
while (true) {
while (keyboard_has_activity()) {
process_keyboard_input();
}
while (mouse_has_activity()) {
process_mouse_input();
}
do_other_computation_for_a_short_time();
}
Как написать keyboard_has_activity
? Вы упомянули kbhit
от conio.h
в комментарии; это должно работать. Вы также можете использовать прерывания более низкого уровня (хотя я не знаю причин не использовать kbhit
).
Примечание. process_keyboard_input
следует читать только то количество символов, которое доступно в данный момент. Если ваша программа предполагает ожидание нажатия пользователем Enter, то вам придется хранить введенные символы (скажем) в массиве до тех пор, пока вы действительно не увидите клавишу Enter, а затем обработать весь ввод сразу.
Как написать mouse_has_activity
? Насколько мне известно, для запросите текущее состояние мыши и сравните его с тем, что было при последнем вызове.
Как написать do_other_computation_for_a_short_time
? Вам нужно будет разработать какой-то временной интервал в алгоритме. Например, если вы пишете шахматный движок, он будет проверять часы после каждой (скажем) оценки доски и останавливаться при необходимости, чтобы вы могли опросить ввод. Когда алгоритм останавливается, он должен запомнить в структуре данных, где он был, чтобы позже возобновить работу с этой точки. Одной из распространенных стратегий является ведение рабочего списка: списка всех частей вычислений, которые еще необходимо выполнить. Это форма совместной многозадачности.
В любом случае вы хотите, чтобы время было не более 10 мс, иначе вы можете пропустить щелчки мышью (пользователь может нажать и отпустить кнопку, прежде чем вы это заметите).
Это решение простое, но не обязательно самое эффективное, и потенциально ненадежное из-за вышеупомянутой проблемы с пропущенными щелчками мыши, если ограничение по времени слишком велико.
прерывания
Другой способ сделать это — подключиться к низкоуровневым прерываниям клавиатуры и мыши а>. Таким образом, вы устанавливаете код, который запускается только при прикосновении к устройству ввода, что более эффективно. Однако также намного сделать это правильно по ряду причин, в том числе из-за того, что у вас мало контроля над тем, что делает тот или иной фрагмент кода, когда он прерывается.
Отсутствие ответа: многопоточность
В этой среде нецелесообразно пытаться организовать вашу программу как два потока (мышь и клавиатура) с двумя функциями, работающими одновременно. В DOS нет средств для работы с потоками, и я не знаю, как добавить их, не переписывая ОС. Вместо этого вам нужно будет делать все из одного потока управления.
person
Scott McPeak
schedule
07.09.2019
kbhit()
изconio.h
решить проблему? - person Son of Stackoverflow   schedule 07.09.2019