Как работает event loop ?
Posted: Wed 26 Feb, 2014 10:28
Всем привет, я делаю тулкит (https://github.com/elw00d/consoleframework) для разработки консольных приложений, и заинтересовался тем, как FAR хорошо справляется с максимизацией-восстановлением окна
Поковыряв исходники, нашёл алгоритм того, как это должно работать (interf.cpp:339). Это работает, но если пользователь сам меняет состояние окна (нажимает на кнопку максимизации / восстановления), то функция ChangeVideoMode(int maximized) должна быть перевызвана. А поймать этот момент в моём приложении не удаётся - в ReadConsoleInput эти события не приходят. Остаётся либо ждать какого-то другого события ввода (и до этих пор консоль будет с паразитными скроллбарами), либо по таймеру проверять IsZoomed и IsIconic. Но в FAR эта штука работает ! Поковыряв код FAR, я пришёл к выводу, что FAR не использует ожидание ввода (WaitForSingleObject(stdInputHandle)/WaitForMultipleObjects) а просто в бесконечном цикле проверяет наличие ввода в буфере, а между итерациями цикла выполняет Sleep(20), разгружающий процессор. Но если бы это было так, то при удалении всех вызовов Sleep FAR бы стал кушать 100% времени того ядра, на котором он запущен. Я удалил для теста все вызовы Sleep() в keyboard.cpp, и у меня больше 8-10% не получилось (а должно быть 25%).
В общем, в связи с сомнениями на этот счёт хочу поинтересоваться - правильно ли моё предположение про способ обработки событий в FAR ?
Поковыряв исходники, нашёл алгоритм того, как это должно работать (interf.cpp:339). Это работает, но если пользователь сам меняет состояние окна (нажимает на кнопку максимизации / восстановления), то функция ChangeVideoMode(int maximized) должна быть перевызвана. А поймать этот момент в моём приложении не удаётся - в ReadConsoleInput эти события не приходят. Остаётся либо ждать какого-то другого события ввода (и до этих пор консоль будет с паразитными скроллбарами), либо по таймеру проверять IsZoomed и IsIconic. Но в FAR эта штука работает ! Поковыряв код FAR, я пришёл к выводу, что FAR не использует ожидание ввода (WaitForSingleObject(stdInputHandle)/WaitForMultipleObjects) а просто в бесконечном цикле проверяет наличие ввода в буфере, а между итерациями цикла выполняет Sleep(20), разгружающий процессор. Но если бы это было так, то при удалении всех вызовов Sleep FAR бы стал кушать 100% времени того ядра, на котором он запущен. Я удалил для теста все вызовы Sleep() в keyboard.cpp, и у меня больше 8-10% не получилось (а должно быть 25%).
В общем, в связи с сомнениями на этот счёт хочу поинтересоваться - правильно ли моё предположение про способ обработки событий в FAR ?