почему цикл while используется для не умирающих процессов? - PullRequest
0 голосов
/ 03 ноября 2010

Для приложений, которые не должны умирать, следует реализовать цикл while, afaik.как

while(){
  key = getKeyPress();
  if(key)
    processKey(key);

}

Я вижу 200 программ, зависающих при использовании "top".Это означает, что существует 200 циклов while!

Я ожидаю, что каждая программа будет привязывать события к операционной системе.Когда эти события происходят, операционная система вызывает эти перехватчики программ.

Веб-программы выполняют коды javascript при инициализации.Затем мы зацепляем кнопку, если щелкаем ($ ('button'). Click (myClickJs)), зацепляем таймер (setInterval) и т. Д. Мы не используем цикл для ожидания целых событий на странице.Такой подход значительно экономит время и ресурсы процессора.

Почему такого подхода нет?

1 Ответ

0 голосов
/ 03 ноября 2010

Для «приложений, которые не должны умирать», цикл ДОЛЖЕН быть реализован где-то. Вы не можете обойти это.

В вашем примере кода он ожидает нажатия клавиши, прежде чем делать то, что нужно сделать в ответ на нажатие этой клавиши. После того, как нажатие клавиши обнаружено и обработано, как вы можете сбросить его для ожидания другого нажатия клавиши (или другого типа ввода)? Ответ, конечно, заключается в использовании цикла (как вы сделали).

Этот "внешний" цикл никоим образом не отражает того, что происходит внутри подпрограммы 'getKeyPress ()'. Существует два режима, в которых эта процедура может работать - опрос и блокировка.

Если это процедура опроса, ваш пример кода будет эффективно занят - дождитесь нажатия клавиши. Известно, что это неэффективное использование процессора (хотя для некоторых проблем это правильное решение).

Если это процедура блокировки, поток / задача будет блокироваться до тех пор, пока не будет нажата клавиша. Будучи заблокированным, этот поток / задача не будет потреблять циклы процессора, что позволит использовать их другому потоку / задаче / процессу. Для целей этого ответа конкретные подробности о том, как реализован этот блокирующий вызов, не имеют значения. Важной концепцией является то, что поток / задача может блокироваться.

Без «внешнего» цикла вы получите только один проход при обнаружении и обработке любых нажатий клавиш, независимо от того, есть у вас зацепки или нет.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...