Latest post of the previous page:
SUSim, я какое-то время не смогу обсуждать вопросы по существу, надеюсь что через несколько дней смогу.far.Timer и сборка мусора
LuaFAR — библиотека для создания плагинов на языке Lua
НОРМАЛЬНО. сам иногда сильно офлайн бываю...
Ничего страшного не случилось
Ничего страшного не случилось
Last edited by SUSim on Mon 20 Jan, 2025 18:23, edited 1 time in total.
SimSU ··· ·· -- ··· ··-
-
Shmuel
- Posts: 7243
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 48 times
- Been thanked: 635 times
LuaFAR — библиотека для создания плагинов на языке Lua
Снова о far.Timer. Не нашёл нового, более приемлемого решения.
Итак, на данный момент 2 варианта: старый и новый (который от 19 января).
Старый:
Имеет описанную в предыдущих постах проблему неудаления таймеров и сопутствующего им кода при перезагрузке макросов.
Эту проблему макрописатель может предотвратить путём:
1) присвоения возвращаемых хэндлов таймера локальным переменным верхнего уровня макрофайла, и
2) закрытием этих хэндлов в обработчике ExitFAR.
Новый:
Не имеет проблемы старого варианта, но имеет проблему удаления таймеров сборщиком мусора.
Эта проблема решается пунктом (1) решения для старого варианта, пункт (2) не нужен.
Дилемма: оставить новый или откатить на старый вариант? Или что-то третье?
Итак, на данный момент 2 варианта: старый и новый (который от 19 января).
Старый:
Имеет описанную в предыдущих постах проблему неудаления таймеров и сопутствующего им кода при перезагрузке макросов.
Эту проблему макрописатель может предотвратить путём:
1) присвоения возвращаемых хэндлов таймера локальным переменным верхнего уровня макрофайла, и
2) закрытием этих хэндлов в обработчике ExitFAR.
Новый:
Не имеет проблемы старого варианта, но имеет проблему удаления таймеров сборщиком мусора.
Эта проблема решается пунктом (1) решения для старого варианта, пункт (2) не нужен.
Дилемма: оставить новый или откатить на старый вариант? Или что-то третье?
- zg
- zero-gravity
- Posts: 6207
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 206 times
- Contact:
LuaFAR — библиотека для создания плагинов на языке Lua
я за второй вариант, в нём помимо всего последствия ошибочного кода локализованы во времени и «пространстве».
- John Doe
- Бюрократ
- Posts: 14580
- Joined: Wed 27 Apr, 2005 20:42
- Location: github.com/FarManagerLegacy
- Has thanked: 92 times
- Been thanked: 514 times
- Contact:
LuaFAR — библиотека для создания плагинов на языке Lua
Если выбирать из двух, то новый.
Но желательно подумать о третем, более лёгким в использовании, но в то же время и устойчивым к возможным ошибкам.
1а. По-старому, но автоматически сохранять ссылки на объекты таймеры, и при перезагрузке закрывать принудительно.
2а. По-новому, но защищать от преждевременной сборки мусора, автоматически сохраняя ссылки на объекты.
При перезагрузке не только удалять ссылки, но ещё
и принудительно закрывать (или collectgarbage).
Но желательно подумать о третем, более лёгким в использовании, но в то же время и устойчивым к возможным ошибкам.
1а. По-старому, но автоматически сохранять ссылки на объекты таймеры, и при перезагрузке закрывать принудительно.
2а. По-новому, но защищать от преждевременной сборки мусора, автоматически сохраняя ссылки на объекты.
При перезагрузке не только удалять ссылки, но ещё
и принудительно закрывать (или collectgarbage).
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
LuaFAR — библиотека для создания плагинов на языке Lua
John Doe, оба ваши варианта мне кажутся заточенными на LuaMacro и (видимо) предполагают обёртку (wrapper) вокруг far.Timer, позволяющую вклиниваться в вызов far.Timer и куда-то сохранять возвращённый хэндл. Думал об этом, но хотелось решения в LuaFAR, а не в конкретном плагине LuaMacro.
- John Doe
- Бюрократ
- Posts: 14580
- Joined: Wed 27 Apr, 2005 20:42
- Location: github.com/FarManagerLegacy
- Has thanked: 92 times
- Been thanked: 514 times
- Contact:
LuaFAR — библиотека для создания плагинов на языке Lua
Что если far.Timer безо всяких врапперов будет сохранять ссылки на созданные таймеры где-нибудь в Registry (а закрытые удалять).
Тогда Luamacro сможет использовать эти ссылки для закрытия таймеров, и ровно то же сможет делать произвольный LuaFar-плагин; соответствующие действия могут быть также предусмотрены в процедурах, перезагружающих скрипт плагина (забыл как команды называются).
P.S.
Чтобы не приходилось руками лазить в Registry, можно было бы вынести это в команду типа far.TimerCloseAll.
Last edited by John Doe on Tue 21 Jan, 2025 22:41, edited 1 time in total.
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
LuaFAR — библиотека для создания плагинов на языке Lua
Лазить в Registry руками это подразумевается библиотека debug?John Doe wrote: Tue 21 Jan, 2025 22:32 Чтобы не приходилось руками лазить в Registry, можно было бы вынести это в команду типа far.TimerCloseAll.
far.TimerCloseAll - у нас уже есть far.FreeSettings из той же оперы.
Видимо у меня за последние годы склад ума изменился (не факт, что в лучшую сторону), или вкусы изменились, но больше подобного не хочется.
- John Doe
- Бюрократ
- Posts: 14580
- Joined: Wed 27 Apr, 2005 20:42
- Location: github.com/FarManagerLegacy
- Has thanked: 92 times
- Been thanked: 514 times
- Contact:
LuaFAR — библиотека для создания плагинов на языке Lua
Да.
Как по мне тоже нормальное решение, этим подчёркивается, что это сугубо внутренние дела, а не часть API.
Можно и не в Registry хранить, а скажем, в far.timers, но тогда это надо будет документировать.
Что вы имеете ввиду?
Last edited by John Doe on Wed 22 Jan, 2025 00:03, edited 1 time in total.
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
LuaFAR — библиотека для создания плагинов на языке Lua
Механизмы наподобие того, что в far.FreeSettings. Это субъективно, о чём сказал выше.John Doe wrote: Tue 21 Jan, 2025 23:35 Shmuel писал(а): ↑Ср 22 янв, 2025 01:30
но больше подобного не хочется.
Что вы имеете ввиду?
- John Doe
- Бюрократ
- Posts: 14580
- Joined: Wed 27 Apr, 2005 20:42
- Location: github.com/FarManagerLegacy
- Has thanked: 92 times
- Been thanked: 514 times
- Contact:
LuaFAR — библиотека для создания плагинов на языке Lua
Есть много путей, и конкретная реализация непринципиальна.
Я исхожу из того что апи должен функционировать максимально предсказуемо, по принципу наименьшего удивления.
В данном случае:
Но зачем, если можно просто сделать их очевидными?
Я исхожу из того что апи должен функционировать максимально предсказуемо, по принципу наименьшего удивления.
В данном случае:
- при перезагрузке макросов ожидается что и таймеры будут "перезагружены" (а не как раньше)
- работающий таймер не является мусором, и ситуация, при которой он "самопроизвольно" неожиданно для пользователя прекращает работу не должна быть возможной (а не как сейчас).
Но зачем, если можно просто сделать их очевидными?
https://t.me/FarManager — Telegram чат
- buniak_a_h
- Posts: 4559
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 242 times
- Been thanked: 674 times
- Contact:
LuaFAR — библиотека для создания плагинов на языке Lua
Есть нечто общее между таймером и файловым дескриптором. Например, если (локальные) переменные, которым присваивается созданный дескриптор (
Итак:
Извините, если глупость сморозил. Не со зла.
t=far.Timer или hf=io.open) после выхода из области видимости становятся недоступными, но продолжают "активничать" (таймер вызывает хендлер, файл остаётся занятым и открытым), хотя управление над этими объектами "утеряно" (главное - :close() недоступен). Мне это кажется (и всегда казалось) некорректным. Особенно странно (по поводу таймера), что ситуацию не исправляет перезагрузка макросов! К счастью, файл освобождается. Итак:
- Хотелось бы, чтобы одинаково вели себя оба объекта. Если файл закрывается, то и таймер должен закрываться.
- Наверно, было бы удобно (и полезно), если бы велись таблицы открытых таймером, файлов и т.п. ресурсов. Доступ к этим спискам было бы удобно иметь наподобие функции
mf.EnumScripts. Тем более я подозреваю, что такие списки внутри FAR-а всё равно ведутся.
Извините, если глупость сморозил. Не со зла.
-
Shmuel
- Posts: 7243
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 48 times
- Been thanked: 635 times
LuaFAR — библиотека для создания плагинов на языке Lua
Но то же самое и в других языках. Если в С/С++ вызвать fopen() и не присвоить возвращаемое значение переменной, не будет доступа к файловым операциям для этого открытого файла.buniak_a_h wrote: Wed 22 Jan, 2025 15:27 хотя управление над этими объектами "утеряно" (главное - :close() недоступен). Мне это кажется (и всегда казалось) некорректным
После коммитов 19 и 21 января такого не должно быть.buniak_a_h wrote: Wed 22 Jan, 2025 15:27 Особенно странно (по поводу таймера), что ситуацию не исправляет перезагрузка макросов!
Остальное не комментирую. Не потому, что глупость, просто нет времени.