почему цикл while используется для неумирающих процессов?

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

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

}

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

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

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

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


person nerkn    schedule 03.11.2010    source источник
comment
Я не могу понять, что вы спрашиваете. Почему нет какого подхода?   -  person Marcelo Cantos    schedule 03.11.2010


Ответы (1)


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

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

Этот «внешний» цикл никоим образом не отражает того, что происходит внутри подпрограммы «getKeyPress()». Есть два режима, в которых может работать эта подпрограмма: опрос и блокировка.

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

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

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

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

person Sparky    schedule 03.11.2010
comment
Мне просто интересно это. Для обычной программы ожидаются события мыши, таймер, клавиша, сетевая активность. Так что блокировка не должна работать. Я думаю, что процессоры быстрее. Так что тело не волнует. - person nerkn; 03.11.2010
comment
Для программ, которые ожидают несколько источников ввода, блокирующие вызовы могут по-прежнему работать, но дизайн программы может измениться. 1. Заблокируйте ожидание любого ввода. 2. Определите тип ввода. 3. Обработка ввода. 4. Возврат к 1. Для программ, которым требуется выполнение другой работы во время ожидания ввода, используйте другой поток. - person Sparky; 03.11.2010
comment
Кроме того, несмотря на то, что центральные процессоры действительно работают быстрее, чем когда-то, приложение, которое вы пишете, часто не является единственным, используемым в системе. Когда несколько приложений бесполезно потребляют процессорное время, это влияет на производительность пользователя и работу с другими приложениями. Как разработчик, я не в праве говорить, какое приложение важнее для пользователя, и я хочу, чтобы его опыт был настолько же приятным, насколько и практичным. - person Sparky; 03.11.2010