HaRT wrote: Wed 15 Jan, 2025 00:25
Безотносительно Луа, вызывать сборщик мусора самостоятельно — это жест отчаяния. По хорошему необходимо просто занулять все переменные (в т.ч. поля таблиц), и особенно типа Замыкание (Closure; например, локально созданные функции), значение которых больше не нужно.
Как вызывать сборщик мусора безотносительно к таймеру - я знаю. Перечисленные Вами мероприятия не всегда приводят к желаемому эффекту просто потому, что сборщик мусора работает "в паузах" (например, когда диалог ждёт клавиатуры). Поэтому иногда (при длительных "расчётных" операциях) приходится вызывать его напрямую (
collectgarbage('collect')).
Возможно, я (точнее, Гугл) неправильно перевёл написанное, но понял так, что пока таймер не закрыт (Closed=false), он не даёт сборщику мусора приступить к сборке (ну, или то, что разместил таймер (функция OnTimer) не освобождается и, соответственно, не участвует в сборке мусора.
John Doe wrote: Wed 15 Jan, 2025 00:29
Как часто вызывается таймер?
Часто. По умолчанию - 50 мс
John Doe wrote: Wed 15 Jan, 2025 00:29
Не может ли быть такого, что в "очереди" накопилось некоторое количество вызовов, которые в какой-то момент начинают разом выполняться?
По-моему, не может, т.к. обработчик
OnTimer первой же командой запрещает таймер (
tmr.Enabled = false), далее делается нечто в обёртке
pcall (чтобы даже в случае вылета выполнение
OnTimer продолжилось) и только потом "отпускается" таймер (
tmr.Enabled = true). Это, вроде, гарантирует не-накопление событий.
John Doe wrote: Wed 15 Jan, 2025 00:29
Или же можно управлять им в зависимости от того, когда последний раз приходило клавиатурное или мышиное событие.
Вообще-то, таймер запускается/перезапускается по событию
ConsoleEvent.