far.Timer

Здесь обсуждается всё, что касается макросов.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

far.Timer

Post by John Doe »

В статье far.Timer сказано:
luafar_manual.chm wrote:...
Notes:
...
2. The handler should take into account that at the moment it is called, the timer can already be closed. It can be found out by examining the Closed property of the timer.
В примере так и делается: функция начинается проверкой условия if h.Closed then return end.
Хотелось бы уточнить, как в теории может возникнуть такая ситуация (в данном примере)?

Рекомендуется ли всегда начинать обработчик таймера такой проверкой?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

John Doe wrote:Хотелось бы уточнить, как в теории может возникнуть такая ситуация (в данном примере)?
Сигналы Фару о том, что надо вызвать таймер, поступают относительно регулярно, потому что из отдельного потока. Фар в это время может выполнять продолжительную операцию (свою или другого плагина). Вызовы таймера будут задерживаться и могут накапливаться.
John Doe wrote:Рекомендуется ли всегда начинать обработчик таймера такой проверкой?
Зависит от логики задачи. В любом случае, вызов метода уже закрытого таймера - это ошибка. Если же обработчик к таймеру не обращается, можно и не проверять.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

Теперь понятно, вызовы могут накопиться.
Но в принципе LuaFAR мог бы и сам проверять ситуацию с закрытым таймером?
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

John Doe wrote:Но в принципе LuaFAR мог бы и сам проверять ситуацию с закрытым таймером?
И что LuaFAR должен был бы делать, если таймер закрыт? Молча игнорировать вызовы методов или выдавать сообщение об ошибке? (Кстати, я уже не помню, что будет при вызове метода закрытого таймера - давно это было).
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

Shmuel wrote:И что LuaFAR должен был бы делать, если таймер закрыт?
То же, что в вашем примере: в момент получения управления проверять состояние таймера, и завершать работу функции если таймер закрыт.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

Сделал так.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

Маленькое пожелание по функции far.Timer: добавить дополнительные параметры, которые будут передаваться обработчику:
timer = far.Timer (interval, handler[,...])
(аналогично far.RecursiveSearch)

Update
http://bugs.farmanager.com/view.php?id=2673
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

На мантис.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

При изменении свойства timer.Interval отсчёт времени начинается с 0.
Стоит отразить в документации, ведь в некоторых случаях это можно использовать.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

Если мне не изменяет память, то сначала функция дожидается истечения текущего (прежнего) интервала, и лишь затем отсчёт нового интервала начинается с нуля.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

Перед тем как написать я проверил экспериментально.
  1. local timer=far.Timer(1000,function(timer,start)
  2.  
  3.   timer:Close()
  4.  
  5.   far.Message(Far.UpTime-start)
  6.  
  7. end,Far.UpTime)
  8.  
  9. win.Sleep(500)
  10.  
  11. timer.Interval=1000
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: LuaFAR — библиотека для создания плагинов на языке Lua

Post by Shmuel »

Хорошо, будет отражено в документации.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: LuaFAR — библиотека для создания плагинов на языке Lua

Post by John Doe »

Shmuel wrote:Сигналы Фару о том, что надо вызвать таймер, поступают относительно регулярно, потому что из отдельного потока. Фар в это время может выполнять продолжительную операцию (свою или другого плагина). Вызовы таймера будут задерживаться и могут накапливаться.
Возможно ли в принципе извлечь хотя бы какую-то пользу от накопления вызовов?
Сходу не смог придумать такую задачу.
Может стоит запретить накопление? Чтобы следующий вызов таймера ставился в очередь не ранее, чем начал обрабатываться предыдущий.

С тем, как реализовано сейчас тоже проблем нет. Но если поставить слишком маленький интервал, то можно наблюдать торможение (не исследовал, возможно в итоге память исчерпывается).
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

far.Timer

Post by John Doe »

John Doe wrote: Wed 06 Aug, 2014 14:02Возможно ли в принципе извлечь хотя бы какую-то пользу от накопления вызовов?
Сходу не смог придумать такую задачу.
Зато о вреде легко скажу.
Во-первых, не зная деталей реализации легко ошибиться в использовании этой функции.
И я так делал, и вот свежий пример: http://forum.farmanager.com/viewtopic.p ... 55#p146555

Во-вторых, недавно упоминалось и то, что очередь вызовов не бесконечна, и при определённых условиях может и переполнится.
И даже если не переполнится, но в итоге может накопиться достаточно большое количество (ненужных) вызовов, при обработке которых например интерфейс будет подтормаживать (наблюдал).

Поэтому возвращаюсь к своему предложению:
John Doe wrote: Wed 06 Aug, 2014 14:02Может стоит запретить накопление? Чтобы следующий вызов таймера ставился в очередь не ранее, чем начал обрабатываться предыдущий.
Предполагаю, что можно было бы сделать так: таймер, работающий в отдельном потоке, не просто ставит в очередь пользовательский код, но и контроллирует, что предыдущий элемент очереди выполнен. Если предыдущий не выполнен — то новый не добавляет.

Поправьте, если я где-то ошибаюсь.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

far.Timer

Post by zg »

все задачи с таймерами можно разбить на две группы: где важно количество вызовов и где не важно. текущая реализация работает и там и там. то, что предлагаете вы - работает лишь со второй группой.
Post Reply

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