Как плагину узнать, что посланный макрос отработал?

Место, где разработчики плагинов могут поделиться своим опытом.
User avatar
NightRoman
Posts: 6034
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 20 times
Been thanked: 49 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

Latest post of the previous page:

Shmuel,
Еще раз попробовал и (1), и (2), и уточненный (2). Вот что получается (не то, что надо):

мой скрипт такой

Code: Select all

keys "CtrlG 1 2 3"
job {
	$Far.Message($Far.Dialog[2].Text)
}
Что ожидаем от него: открываем диалог Apply command в панелях, там печатаем "123" (затем проверяем "123", но в примере просто показываем в другом диалоге).
Что получается: по-разному, но чаще вот что: в диалоге напечатало только "1"

Code: Select all

╔══════════════════════════   ╔════════╗   ══════════════════════════╗
║ Enter command to process    ║   1    ║                             ║
║ 1                           ╟────────╢                            ↓║
╟──────────────────────────   ║ { OK } ║   ──────────────────────────╢
║                         {   ╚════════╝                             ║
╚══════════════════════════                ══════════════════════════╝
Last edited by NightRoman on Fri 01 Jan, 2021 22:15, edited 1 time in total.
User avatar
NightRoman
Posts: 6034
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 20 times
Been thanked: 49 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

Словом, моя "концовка", любым способом заданная, вызывается до того как все Keys() отыграны.
User avatar
NightRoman
Posts: 6034
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 20 times
Been thanked: 49 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

Думаю, надо описать работающий хак тоже. Моя "концовка" такая:

Code: Select all

mf.env('FarNet.Tasks.macro', 1, '1')
и в отдельном потоке я жду когда переменная окружения станет равна "1".
Это работает. Теперь уже начинаю думать, что случайно...
citRiks
Posts: 1097
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 342 times
Been thanked: 57 times

Как плагину узнать, что посланный макрос отработал?

Post by citRiks »

NightRoman, А если не запускать far.Message(), то получится "123" там где надо?
ну вот, да, я так и подумал что диалог попадая в фокус перехватывает нажатия.
А псевдо-синхронизацию чтобы не перехватывать, можно сделать миллионом способов,
включая через переменную как ты и сделал.

А почему это "случайно работает" ? Вроде ожидаемо и повтояемо, не ?
Last edited by citRiks on Fri 01 Jan, 2021 22:27, edited 1 time in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
NightRoman
Posts: 6034
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 20 times
Been thanked: 49 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

citRiks wrote: Fri 01 Jan, 2021 22:24 NightRoman, А если не запускать far.Message(), то получится "123" там где надо?
Получится. Но это ни о чем не говорит. В тесте, я думаю, Фар честно печатает и "23", только уже когда мой far.Message() на экране, что не имеет эффекта.
User avatar
NightRoman
Posts: 6034
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 20 times
Been thanked: 49 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

Задача максимум, чтобы конструкции keys и job (и пара других) выполнялись синхронно в специальном скрипте.
А тут получается, что job вызывается слишком рано, когда keys еще не доработали.
citRiks
Posts: 1097
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 342 times
Been thanked: 57 times

Как плагину узнать, что посланный макрос отработал?

Post by citRiks »

А псевдо-синхронизацию чтобы не перехватывать, можно сделать миллионом способов,
включая через переменную как ты и сделал
NightRoman,
джоб может ждать простейшего сигнала завершения.
Макрос запускается вместе с уникальным токеном,
в конце исполнения этот токен куда нибудь кладется,
хоть в переменную, хоть в регистр, хоть куда.
Джоиб ожидает это заранее изветного токена в заранее известном месте,
и получив его делает свою непосредственную работу.

может я тут и повторяю твою же идею,
но вроде выглядит как рабочее решение, не?
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
NightRoman
Posts: 6034
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 20 times
Been thanked: 49 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

citRiks, ну да, тут все идеи в общем именно об этом. Но некоторые реализации работают, некоторые нет. Оба случая пока для меня не вполне понятны :)
citRiks
Posts: 1097
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 342 times
Been thanked: 57 times

Как плагину узнать, что посланный макрос отработал?

Post by citRiks »

Псевдо-код:

Code: Select all

<пс-алиас-для-фар-кейс>= функция(переменная-кейс, уникальный-токен)
     Фар-Кейс(переменная-кейс)
     Сохранить-токен-в-регистр-токенов(уникальный-токен)
конец-функции

<джоб>=функция(джоб-который-сделать, уникальный-токен)
     Начало-цикла-ожидания-токена
         <проверяем-наличие-токена-выходим-из-цикла>
     конец-цикла
     <выполняем-джоб> джоб-который-сделать
конец-функции
Нет, вру, и извиняюсь.
Keys - это асинхронная функция,
в том смысле, что мы можем закинуть через нее нажатия,
но не знаем наверняка когда они все пройдут

Пути решения:
Мониторить непосрественно внутреннюю очеред нажатий ФАРа,
она есть (ее не может не быть), дожидаясь когда она станет пустой
Last edited by citRiks on Fri 01 Jan, 2021 22:48, edited 2 times in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
User avatar
NightRoman
Posts: 6034
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 20 times
Been thanked: 49 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

Надо будет поспать на этом и все случаи еще раз проверить, попробовать. Второпях, может, пропускаю явный ляп какой.
citRiks
Posts: 1097
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 342 times
Been thanked: 57 times

Как плагину узнать, что посланный макрос отработал?

Post by citRiks »

NightRoman,
citRiks wrote: Fri 01 Jan, 2021 22:43 Keys - это асинхронная функция,
в том смысле, что мы можем закинуть через нее нажатия,
но не знаем наверняка когда они все пройдут
Кстате,
в WindowsApi есть как асинхронный "Keys(..)", так и синхронный "KeysWait(..)".
В ФАРе ест только асинхронный Keys(..).
Не знаю насколько это возможно и будет ли вписыватся в архитектуру ФАРа,
(вопрос-обращение к разработчикам:)
но может быть стоит добавить KeysWait(..) и в ФАР ?
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
Shmuel
Posts: 6194
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 337 times

Как плагину узнать, что посланный макрос отработал?

Post by Shmuel »

NightRoman, да, тут легко ошибиться. Однако я проверил, это работает:

Code: Select all

  mf.AddExitHandler(mf.postmacro,
    function()
      local str = Dlg.GetValue(3,0)
      Plugin.SyncCall(<guid>, str)
    end)
  Keys("CtrlG 1 2 3")
Код упрощённый, в предположении, что плагин ожидает единственный параметр типа стринг.
citRiks
Posts: 1097
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 342 times
Been thanked: 57 times

Как плагину узнать, что посланный макрос отработал?

Post by citRiks »

Shmuel,
lua:mf.AddExitHandler(mf.postmacro, function() local str = Dlg.GetValue(3,0); far.Message(str) end); Keys("CtrlG 1 2 3")
думаю что работает аналогично
Техническое обьяснение:
postmacro всегда встанет в очередь,
таким образом всегда оказываясь после обработки посланных через Keys(..) нажатий,
Все верно?
Правда так тоже работает, но наверное "негарантированно" (?):
lua:Keys("CtrlG 1 2 3 4 5 6 7 8 9 0"); local str = Dlg.GetValue(3, 0); far.Message(str)
или в сценарии "из ФАР-Луа среды такая проблема как с вышеупомянутыми вызовами через плагин вообще не стоит?
Last edited by citRiks on Fri 01 Jan, 2021 23:37, edited 1 time in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
Shmuel
Posts: 6194
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 337 times

Как плагину узнать, что посланный макрос отработал?

Post by Shmuel »

citRiks wrote: Fri 01 Jan, 2021 23:32Все верно?
Верно, в том смысле, что это "вырожденный" случай, где макро-плагин и плагин-хозяин оба в одном лице.
User avatar
NightRoman
Posts: 6034
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 20 times
Been thanked: 49 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

Shmuel, citRiks, спасибо за обсуждение, было очень конструктивно и полезно в результате.

Рабочим остается изначальный подход с двумя макросами и ожиданием сигнала в соседнем потоке. Изначальный грубый цикл "пока переменная окружения установится" заменил на предложенный Plugin.SyncCall, в котором сигналю более эффективным способом. Это заметно ускорило работу авто тестов.

NB Почему не работали промежуточные попытки, точно уже не скажу, наверное, мои ляпы второпях с синхронизацией всего. На свежую голову сделанное работает :)
User avatar
NightRoman
Posts: 6034
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 20 times
Been thanked: 49 times
Contact:

Как плагину узнать, что посланный макрос отработал?

Post by NightRoman »

Все же добавлю, что помощь от Фара для плагина не помешала бы - дополнительный метод посылки макроса с колбэком по завершению.
И повозиться пришлось порядочно, и не очень красиво это с дополнительными искусственными макросами и их обработкой.
Post Reply

Return to “Разработка плагинов”