Дождаться закрытия всех модальных диалогов
Дождаться закрытия всех модальных диалогов
День добрый!
Может кто знает, как можно в lua-скрипте дождаться закрытия всех текущих модальных диалогов?
Т.е. мне неизвестен GUID диалога.
Зачем нужно - вызываю диалог копирования файлов - он может быть как нативный фара, так и, например, NetBox-а.
Скрипту требуется дождаться окончания копирования файлов.
Может кто знает, как можно в lua-скрипте дождаться закрытия всех текущих модальных диалогов?
Т.е. мне неизвестен GUID диалога.
Зачем нужно - вызываю диалог копирования файлов - он может быть как нативный фара, так и, например, NetBox-а.
Скрипту требуется дождаться окончания копирования файлов.
-
- Posts: 6820
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 528 times
Дождаться закрытия всех модальных диалогов
Вариант 1: обрабатывать 2, 3 или сколько нужно гуидов диалогов одновременно.
Вариант 2: воспользоваться функцией far.Timer с периодом, скажем 100ms и ловить ситуацию not Area.Dialog.
Вариант 2: воспользоваться функцией far.Timer с периодом, скажем 100ms и ловить ситуацию not Area.Dialog.
Дождаться закрытия всех модальных диалогов
Спасибо.
Где-то почитать про Area.Dialog можно? в энциклопедии к lua не нашел, таймеры нашел.
Подписаться на все события DM_CLOSE нельзя, правильно понимаю?
Сделал пока так:
На производительности FARа такое не сказывается?
Если сделать в синхронном режиме, будет ли все нормально?
Типа в скрипте в точке ожидания:
Или это очень негативно скажется на работе?
Где-то почитать про Area.Dialog можно? в энциклопедии к lua не нашел, таймеры нашел.
Подписаться на все события DM_CLOSE нельзя, правильно понимаю?
Сделал пока так:
Code: Select all
function MsgBox( msg )
far.Message( msg )
end
local counter = 30
local timer = far.Timer(
1000,
function ( h )
if h.Closed then return end
if ( Area.Dialog ) then
if ( counter > 0 ) then
counter = counter -1
else
h:Close()
MsgBox( "Too long" )
end
else
h:Close()
MsgBox( "No dialog" )
end
end
)
Если сделать в синхронном режиме, будет ли все нормально?
Типа в скрипте в точке ожидания:
Code: Select all
for ...
if Area.Dialog then
...
win.Sleep( 1000 )
else
...
end
end
Last edited by ionic on Mon 11 Mar, 2019 12:03, edited 2 times in total.
-
- Posts: 6820
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 528 times
Дождаться закрытия всех модальных диалогов
%farhome%\encyclopedia\macroapi_manual.ru.chm
Можно получать и обрабатывать события DN_CLOSE.
Практически не сказывается.
win.Sleep() "усыпляет" весь Фар.
Дождаться закрытия всех модальных диалогов
Понял, еще раз спасибо.
А win.Sleep точно не трид с запущенным скриптом усыпляет?
Вроде как ACTL_SYNCHRO если использовать - только тогда FAR уснет?
Ну и тогда вопрос - синхронно опрос получается не сделать в таком случае - придется вешать коллбэк?
А win.Sleep точно не трид с запущенным скриптом усыпляет?
Вроде как ACTL_SYNCHRO если использовать - только тогда FAR уснет?
Ну и тогда вопрос - синхронно опрос получается не сделать в таком случае - придется вешать коллбэк?
Last edited by ionic on Mon 11 Mar, 2019 13:28, edited 1 time in total.
-
- Posts: 6820
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 528 times
Дождаться закрытия всех модальных диалогов
1. Скрипты всегда запускаются в основном потоке.
2. Far API (за малыми исключениями) запрещено использовать из неосновных потоков.
3. Синхронно - это значит, что пока ваш скрипт что-то делает, весь остальной Фар ждёт.
2. Far API (за малыми исключениями) запрещено использовать из неосновных потоков.
3. Синхронно - это значит, что пока ваш скрипт что-то делает, весь остальной Фар ждёт.
Дождаться закрытия всех модальных диалогов
Понял.
Про синхронно - имел ввиду, что без коллбэков, в основном потоке скрипта.
А если я через Keys отдаю клавиатурную команду, как тогда сделать паузу, чтобы команда успела обработаться, если Sleep уводит весь фар в паузу?
Про синхронно - имел ввиду, что без коллбэков, в основном потоке скрипта.
А если я через Keys отдаю клавиатурную команду, как тогда сделать паузу, чтобы команда успела обработаться, если Sleep уводит весь фар в паузу?
-
- Posts: 6820
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 528 times
Дождаться закрытия всех модальных диалогов
Не надо паузы, Фар не возвратит управление, покуда команда не обработается.
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Дождаться закрытия всех модальных диалогов
Тонкость. Фактически запрещено из параллельных. Из неосновных можно, но все остальные потоки, включая основной, не должны вызывать Far API в то же время.
- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
Дождаться закрытия всех модальных диалогов
"Официально" нельзя ничего вообще, всё на свой страх и риск, блаблабла.
Дождаться закрытия всех модальных диалогов
Вобщем, опять дикая проблема на простом месте.
Написал ожидание закрытия даилога через таймеры.
Переделал всю логику на коллбэки. Внутри них есть вызов фии Keys что, естественно, приводит к ошибке "yield".
macropost мне не подходит, так как он ставит макро в очередь, а не исполняет в текущем времени.
Вопрос остается открытым - либо как сделать ожидание в главном треде скрипта, или как вызвать Keys внутри коллбэка таймера.
Написал ожидание закрытия даилога через таймеры.
Переделал всю логику на коллбэки. Внутри них есть вызов фии Keys что, естественно, приводит к ошибке "yield".
macropost мне не подходит, так как он ставит макро в очередь, а не исполняет в текущем времени.
Вопрос остается открытым - либо как сделать ожидание в главном треде скрипта, или как вызвать Keys внутри коллбэка таймера.
Last edited by ionic on Tue 12 Mar, 2019 10:50, edited 1 time in total.
Дождаться закрытия всех модальных диалогов
Благодарю, этот скрипт я смотрел, но есть две проблемы:
1) я не уверен, что диалог, вызываемый в NetBox (или в каком-либо другом панельном плагине) по F5 будет всегда иметь GUID диалога Copy
2) у меня скрипт вызывается через lua:@, т.е. "Event" я там использовать не могу - может быть есть пример, где можно посмотреть, как использовать подписку на события без Event?
Дождаться закрытия всех модальных диалогов
На данный момент решил проблему через "ж".
Вот функция ожидания, которая позволяет синхронно (не покидая потока скрипта) ждать, например, закрытия диалога копирования
Вот функция ожидания, которая позволяет синхронно (не покидая потока скрипта) ждать, например, закрытия диалога копирования
Code: Select all
function waitForSync( callback, delay )
local r = false
for k = 1, delay do
Keys( "Ctrl" ) --здесь происходит передача потоку выполнения FAR
r = callback()
if r then break end
end
return r
end
if waitForSync( function() return not Area.Dialog end, 5000 ) == true then
...
else
... timeout ...
end
Last edited by ionic on Tue 12 Mar, 2019 12:18, edited 1 time in total.