Page 1 of 1

Как работает event loop ?

Posted: Wed 26 Feb, 2014 10:28
by elwood.su
Всем привет, я делаю тулкит (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 ?

Re: Как работает event loop ?

Posted: Wed 26 Feb, 2014 22:28
by John Doe
Console Control

Code: Select all

   Также обрабатывается команды Maximize/Restore кнопками консольного окна.
   При желании отключается в настройках плагина.

Re: Как работает event loop ?

Posted: Thu 27 Feb, 2014 06:52
by elwood.su
Спасибо, но я не смог найти исходники к этому плагину, можно скачать только бинарные, а в http://code.google.com/p/far-plugins/source/browse/ ConCtrl нет.

Re: Как работает event loop ?

Posted: Thu 27 Feb, 2014 07:29
by 2useven10

Re: Как работает event loop ?

Posted: Thu 27 Feb, 2014 08:29
by elwood.su
Спасибо !

Смотрю function TConCtrlPlug.ConsoleInput(const ARec :TInputRecord) :Integer; {override;}
судя по коду, мой вопрос остаётся актуальным (или я чего-то не понимаю).

Re: Как работает event loop ?

Posted: Thu 27 Feb, 2014 09:02
by Skirda
elwood.su wrote:при удалении всех вызовов Sleep FAR бы стал кушать 100% времени того ядра, на котором он запущен. Я удалил для теста все вызовы Sleep() в keyboard.cpp, и у меня больше 8-10% не получилось (а должно быть 25%).
В цикле кроме слипа есть еще вызовы ядра - PeekConsoleInput и еже с ним :-)