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

Разработка Far.
Post Reply
elwood.su
Posts: 3
Joined: Wed 26 Feb, 2014 10:13

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

Post 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 ?
User avatar
John Doe
Бюрократ
Posts: 12872
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 293 times

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

Post by John Doe »

Console Control

Code: Select all

   Также обрабатывается команды Maximize/Restore кнопками консольного окна.
   При желании отключается в настройках плагина.
elwood.su
Posts: 3
Joined: Wed 26 Feb, 2014 10:13

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

Post by elwood.su »

Спасибо, но я не смог найти исходники к этому плагину, можно скачать только бинарные, а в http://code.google.com/p/far-plugins/source/browse/ ConCtrl нет.
2useven10
Posts: 4072
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 5 times
Been thanked: 189 times

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

Post by 2useven10 »

elwood.su
Posts: 3
Joined: Wed 26 Feb, 2014 10:13

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

Post by elwood.su »

Спасибо !

Смотрю function TConCtrlPlug.ConsoleInput(const ARec :TInputRecord) :Integer; {override;}
судя по коду, мой вопрос остаётся актуальным (или я чего-то не понимаю).
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 4 times

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

Post by Skirda »

elwood.su wrote:при удалении всех вызовов Sleep FAR бы стал кушать 100% времени того ядра, на котором он запущен. Я удалил для теста все вызовы Sleep() в keyboard.cpp, и у меня больше 8-10% не получилось (а должно быть 25%).
В цикле кроме слипа есть еще вызовы ядра - PeekConsoleInput и еже с ним :-)
We are the Borg. You will be assimilated.
So Say We All!
Post Reply

Return to “Development”