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

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

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

Post by elwood.su » 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 ?

User avatar
John Doe
Бюрократ
Posts: 11247
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 81 times

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

Post by John Doe » Wed 26 Feb, 2014 22:28

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 » Thu 27 Feb, 2014 06:52

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

2useven10
Posts: 3010
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 82 times

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

Post by 2useven10 » Thu 27 Feb, 2014 07:29


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

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

Post by elwood.su » Thu 27 Feb, 2014 08:29

Спасибо !

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

User avatar
Skirda
Posts: 3474
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 1 time

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

Post by Skirda » Thu 27 Feb, 2014 09:02

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”