Всем привет, я делаю тулкит (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 ?
Как работает event loop ?
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Как работает event loop ?
Console Control
Code: Select all
Также обрабатывается команды Maximize/Restore кнопками консольного окна.
При желании отключается в настройках плагина.
Re: Как работает event loop ?
Спасибо, но я не смог найти исходники к этому плагину, можно скачать только бинарные, а в http://code.google.com/p/far-plugins/source/browse/ ConCtrl нет.
Re: Как работает event loop ?
Спасибо !
Смотрю function TConCtrlPlug.ConsoleInput(const ARec :TInputRecord) :Integer; {override;}
судя по коду, мой вопрос остаётся актуальным (или я чего-то не понимаю).
Смотрю function TConCtrlPlug.ConsoleInput(const ARec :TInputRecord) :Integer; {override;}
судя по коду, мой вопрос остаётся актуальным (или я чего-то не понимаю).
Re: Как работает event loop ?
В цикле кроме слипа есть еще вызовы ядра - PeekConsoleInput и еже с нимelwood.su wrote:при удалении всех вызовов Sleep FAR бы стал кушать 100% времени того ядра, на котором он запущен. Я удалил для теста все вызовы Sleep() в keyboard.cpp, и у меня больше 8-10% не получилось (а должно быть 25%).
We are the Borg. You will be assimilated.
So Say We All!
So Say We All!