Для «приложений, которые не должны умирать», цикл ДОЛЖЕН быть реализован где-то. Вы не можете обойти это.
В вашем примере кода он ожидает нажатия клавиши, прежде чем делать то, что нужно сделать в ответ на нажатие этой клавиши. После того, как нажатие клавиши обнаружено и обработано, как вы можете сбросить его для ожидания другого нажатия клавиши (или другого типа ввода)? Ответ, конечно, заключается в использовании цикла (как вы сделали).
Этот "внешний" цикл никоим образом не отражает того, что происходит внутри подпрограммы 'getKeyPress ()'. Существует два режима, в которых эта процедура может работать - опрос и блокировка.
Если это процедура опроса, ваш пример кода будет эффективно занят - дождитесь нажатия клавиши. Известно, что это неэффективное использование процессора (хотя для некоторых проблем это правильное решение).
Если это процедура блокировки, поток / задача будет блокироваться до тех пор, пока не будет нажата клавиша. Будучи заблокированным, этот поток / задача не будет потреблять циклы процессора, что позволит использовать их другому потоку / задаче / процессу. Для целей этого ответа конкретные подробности о том, как реализован этот блокирующий вызов, не имеют значения. Важной концепцией является то, что поток / задача может блокироваться.
Без «внешнего» цикла вы получите только один проход при обнаружении и обработке любых нажатий клавиш, независимо от того, есть у вас зацепки или нет.
Надеюсь, это поможет.