far.Timer: задержка и накопление событий

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

Latest post of the previous page:

zg wrote: Wed 15 Jan, 2025 11:48 при запрете таймера — события игнорируются.
Вопрос в другом: что происходит если какое-то время ACTL_SYNCRO-события не обрабатывается.
  • либо таймер "тупо" пихает новые события в очередь
  • либо "умно" добавляет только если предыдущее уже обработано, а иначе игнорирует.
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

Таймер и сборка мусора

Post by Shmuel »

John Doe wrote: Wed 15 Jan, 2025 12:45 Вопрос в другом: что происходит если какое-то время ACTL_SYNCRO-события не обрабатывается.
либо таймер "тупо" пихает новые события в очередь
либо "умно" добавляет только если предыдущее уже обработано, а иначе игнорирует.
как по мне, то тупо и умно надо переставить местами.
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

Таймер и сборка мусора

Post by zg »

John Doe wrote: Wed 15 Jan, 2025 12:45Вопрос в другом: что происходит если какое-то время ACTL_SYNCRO-события не обрабатывается.
таймер не следит за обработкой и посылает на каждое событие в соответствующее время. если так не надо, есть возможность отключить посылку на время обработки, что в ClickToDrive и делается. поэтому ваш вопрос не очень понятен.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

zg wrote: Wed 15 Jan, 2025 15:45 есть возможность отключить посылку на время обработки, что в ClickToDrive и делается. поэтому ваш вопрос не очень понятен
То о чём вы говорите может предотвратить только излишние вызовы, вызванные задержками в этом отдельно взятом обработчике.
Но что произойдёт, если основной поток был полностью занят 1 секунду другим обработчиком (или функциями самого фара, неважно)?

Исходя из заданного интервала в 50 мс, наш таймер успеет за это время поставить в очередь 20 вызовов.
В результате они вызовутся потом скопом. И 19 из них будут лишними. Поэтому для этого случая я и использовал эпитет "тупо".
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

buniak_a_h wrote: Tue 14 Jan, 2025 23:48 В OnTimer опрашиваются логические диски (win.GetLogicalDriveStrings), составляется строка (table.concat) и этот список выводится на панель (far.Text)
buniak_a_h wrote: Wed 15 Jan, 2025 01:05 Часто. По умолчанию - 50 мс
Надо ли так часто обновлять информации о дисках?

Я бы сделал 2 отдельных таймера.
https://t.me/FarManager — Telegram чат
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

Таймер и сборка мусора

Post by zg »

John Doe wrote: Wed 15 Jan, 2025 16:54В результате они вызовутся потом скопом. И 19 из них будут лишними.
будут, и?
User avatar
buniak_a_h
Posts: 4559
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 242 times
Been thanked: 674 times
Contact:

Таймер и сборка мусора

Post by buniak_a_h »

John Doe wrote: Wed 15 Jan, 2025 17:57 Надо ли так часто обновлять информации о дисках?
Суть не в обновлении информации о дисках, а в перерисовывании списка. ФАР время от времени перерисовывает панель (в т.ч. рамку!), затирая при этом выведенный список дисков. Я сначала повесил перевывод списка дисков на обработчик ConsoleEvent. Но, как оказалось, это тоже не всегда срабатывает. Например, если итемов на панели много, и передвигаемся по панели колёсиком мыши, то в конце концов (когда перемещение останавливается) списка дисков нет. И не появится, пока мышку не сдвинуть. Вот для этого и был сделан таймер.
Если таймаут таймера сделать большим, то список дисков заметно мигает. Пытался (безуспешно) с этим побороться.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

buniak_a_h wrote: Wed 15 Jan, 2025 21:00 Суть не в обновлении информации о дисках, а в перерисовывании списка.
Суть в том что перерисовывать может и надо часто, но обновлять информацию при этом можно намного реже.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

zg wrote: Wed 15 Jan, 2025 20:54будут, и?
И - лучше сделать так чтобы подобной ситуации не возникало.

Полагаю только тогда поведение far.Timer будет соответствует ожидаемому.
https://t.me/FarManager — Telegram чат
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

Таймер и сборка мусора

Post by zg »

John Doe wrote: Wed 15 Jan, 2025 21:44И - лучше сделать так чтобы подобной ситуации не возникало.
почему вы боитесь возникновения подобной ситуации?
John Doe wrote: Wed 15 Jan, 2025 21:44Полагаю только тогда поведение far.Timer будет соответствует ожидаемому.
я перечитал описание far.Timer и не нашёл несоответствий с текущей реализацией.
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

zg wrote: Wed 15 Jan, 2025 22:48 почему вы боитесь возникновения подобной ситуации?
Я её не боюсь, а только лишь хочу исключить, как нежелательную. (Если у вас есть примеры случаев, когда именно текущее поведение оптимально, тогда давайте это обсудим подробнее)
zg wrote: Wed 15 Jan, 2025 22:48 я перечитал описание far.Timer и не нашёл несоответствий с текущей реализацией.
Я утверждаю не то, что документация не соответствует реализации, а то что реализация влечёт
за собой существенные особенности, неочевидные из документации.
Эти особенности как выяснилось были неочевидны даже вам, что же говорить о рядовом читателе мануала.
https://t.me/FarManager — Telegram чат
Shmuel
Posts: 7243
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 48 times
Been thanked: 635 times

Таймер и сборка мусора

Post by Shmuel »

John Doe wrote: Wed 15 Jan, 2025 23:10 Если у вас есть примеры случаев, когда именно текущее поведение оптимально, тогда давайте это обсудим подробнее
Допустим программа построена так, что по срабатыванию таймера делает какую-то определённую порцию работы. Если часть вызовов будет пропускаться, программа будет отставать от своего графика.
Last edited by Shmuel on Wed 15 Jan, 2025 23:31, edited 1 time in total.
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

Таймер и сборка мусора

Post by zg »

John Doe wrote: Wed 15 Jan, 2025 23:10Я её не боюсь, а только лишь хочу исключить, как нежелательную.
приведите реальный пример, когда всё плохо из-за такого поведения.
John Doe wrote: Wed 15 Jan, 2025 23:10(Если у вас есть примеры случаев, когда именно текущее поведение оптимально, тогда давайте это обсудим подробнее)
обсуждали уже 8 лет назад.
John Doe wrote: Wed 15 Jan, 2025 23:10Эти особенности как выяснилось были неочевидны даже вам
внезапно, где?
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

Shmuel wrote: Wed 15 Jan, 2025 23:30 Если часть вызовов будет пропускаться, программа будет отставать от своего графика.
Но если не будет пропускаться, то временами интерфейс фара будет терять отзывчивость (потому что в какой-то момент ввиду непредвиденного влияния внешних факторов программа будет выполнять 20 порций работы вместо одной).

Готов согласиться что есть вероятность того, что это может почему-то оказаться желаемым поведением.
Однако обратных случаев мне видится на 2 порядка больше.

И если изменить с учётом этого текущую реализацию, то никто не помешает при необходимости в пользовательском коде это учесть, и выполнять работу так, как требует ваша гипотетическая задача (т. е. пропорционально реальному времени).

При том это будет абсолютно очевидное решение, тогда как при текущей реализации даже сама проблема неочевидна: создатель темы так и не разобрался что именно вызывает задержки, а я предположил свою версию, потому что когда-то давно сталкивался с чем-то похожим.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 14580
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

Таймер и сборка мусора

Post by John Doe »

zg wrote: приведите реальный пример, когда всё плохо из-за такого поведения.
Я не знаю что вы понимаете под "всё плохо", но реальный пример привёл топикстартер: что-то тормозит непонятно почему, и нельзя исключить, что виноват его скрипт.
zg wrote: обсуждали уже 8 лет назад.
Хорошо что вы знаете, теперь и нам покажите.
zg wrote: Thu 16 Jan, 2025 00:23внезапно, где?
На прошлой странице, там где вы исключаете образовывание очереди вызовов (раз в обработчике таймер деактивируется), а в следующем своём посте не видите такую возможность даже после того как я указал на предполагаемый её механизм - вследствии длинных пауз между вызовами ACTL_SYNCHRO.
(Разумеется я не знаю в этом ли проблема топикстартера, но теоретическая возможность есть)
https://t.me/FarManager — Telegram чат
User avatar
zg
zero-gravity
Posts: 6207
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 206 times
Contact:

Таймер и сборка мусора

Post by zg »

John Doe wrote: Thu 16 Jan, 2025 00:49что-то тормозит непонятно почему, и нельзя исключить, что виноват его скрипт.
не что-то, а браузер. почему вы скрипт, который практически ничего не делает — подозреваете, а какой-нибудь роскомнадзор — нет?
John Doe wrote: Thu 16 Jan, 2025 00:49На прошлой странице, там где вы исключаете образовывание очереди вызовов
я ошибочно понял, что вы имеете собственный обработчик таймера, а не что-то другое. это говорит лишь о моих проблемах в понимании людей, а не о проблемах в понимании того, как работает far.Timer.
John Doe wrote: Thu 16 Jan, 2025 00:49но теоретическая возможность есть
нет.

Code: Select all

local t1=Far.UpTime
for ii=1,200 do
  DiskPrintList()
end
t1=Far.UpTime-t1
far.Show(t1)
у меня выполняется за 11 миллисекунд. т.е. если фар тупил даже 10 секунд, то всё накопившееся выполнится за 11 миллисекунд. и мне очень сильно кажется, что это не то место, где стоит искать причину тормозов браузера.
Post Reply

Return to “Обсуждение макросов”