Я раньше задавался вопросом много о том же!
основной цикл GUI А похож на это в псевдокоде:
void App::exec() {
for(;;) {
vector<Waitable> waitables;
waitables.push_back(m_networkSocket);
waitables.push_back(m_xConnection);
waitables.push_back(m_globalTimer);
Waitable* whatHappened = System::waitOnAll(waitables);
switch(whatHappened) {
case &m_networkSocket: readAndDispatchNetworkEvent(); break;
case &m_xConnection: readAndDispatchGuiEvent(); break;
case &m_globalTimer: readAndDispatchTimerEvent(); break;
}
}
}
, Что такое "Waitable"? Ну, это - системный иждивенец. На UNIX это назвало "дескриптор файла", и "waitOnAll":: выберите системный вызов. Так называемое vector<Waitable>
::fd_set
на UNIX, и "whatHappened" на самом деле запрашивается через FD_ISSET
. Фактические waitable-дескрипторы получены различными способами, например m_xConnection
может быть взят от:: XConnectionNumber (). X11 также обеспечивает высокий уровень, портативный API для этого-:: XNextEvent () - но если бы необходимо было использовать это, Вы не были бы в состоянии ожидать на нескольких источниках события одновременно .
, Как блокирование работает? "waitOnAll" является syscall, который говорит ОС помещать Ваш процесс в "список сна". Это означает, что Вам не дают процессорного времени, пока событие не имеет место на одном из waitables. Это, тогда, означает, что Ваш процесс неактивен, используя 0% ЦП. Когда событие будет иметь место, Ваш процесс будет кратко реагировать на него и затем возвращаться к состоянию ожидания. Приложения для GUI тратят почти весь их время, бездействуя.
, Что происходит со всеми циклами ЦП, в то время как Вы спите? Зависит. Иногда другой процесс будет иметь использование для них. В противном случае Ваша ОС будет занятый цикл ЦП, или помещать его во временный режим низкой мощности, и т.д.
, спросите для получения дальнейшей информации!
Используйте System.Console.Write
вместо System.Console.WriteLine
Это будет
Console.Write("Input a number: ");
// It will return the entire string after the user hits enter
string theNumber = Console.ReadLine();
int number = 0;
if(int.TryParse(theNumber, out number))
{
// Do something with the number
}