Дождаться закрытия всех модальных диалогов

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
ionic
Posts: 19
Joined: Mon 04 Mar, 2019 21:29
Been thanked: 1 time

Дождаться закрытия всех модальных диалогов

Post by ionic »

День добрый!
Может кто знает, как можно в lua-скрипте дождаться закрытия всех текущих модальных диалогов?
Т.е. мне неизвестен GUID диалога.
Зачем нужно - вызываю диалог копирования файлов - он может быть как нативный фара, так и, например, NetBox-а.
Скрипту требуется дождаться окончания копирования файлов.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Дождаться закрытия всех модальных диалогов

Post by Shmuel »

Вариант 1: обрабатывать 2, 3 или сколько нужно гуидов диалогов одновременно.
Вариант 2: воспользоваться функцией far.Timer с периодом, скажем 100ms и ловить ситуацию not Area.Dialog.
ionic
Posts: 19
Joined: Mon 04 Mar, 2019 21:29
Been thanked: 1 time

Дождаться закрытия всех модальных диалогов

Post by ionic »

Спасибо.
Где-то почитать про 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
)
На производительности FARа такое не сказывается?

Если сделать в синхронном режиме, будет ли все нормально?
Типа в скрипте в точке ожидания:

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.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Дождаться закрытия всех модальных диалогов

Post by Shmuel »

ionic wrote: Mon 11 Mar, 2019 11:28 Где-то почитать про Area.Dialog можно?
%farhome%\encyclopedia\macroapi_manual.ru.chm
ionic wrote: Mon 11 Mar, 2019 11:28 Подписаться на все события DM_CLOSE нельзя, правильно понимаю?
Можно получать и обрабатывать события DN_CLOSE.
ionic wrote: Mon 11 Mar, 2019 11:28 На производительности FARа такое не сказывается?
Практически не сказывается.
ionic wrote: Mon 11 Mar, 2019 11:28 Или это очень негативно скажется на работе?
win.Sleep() "усыпляет" весь Фар.
ionic
Posts: 19
Joined: Mon 04 Mar, 2019 21:29
Been thanked: 1 time

Дождаться закрытия всех модальных диалогов

Post by ionic »

Понял, еще раз спасибо.

А win.Sleep точно не трид с запущенным скриптом усыпляет?

Вроде как ACTL_SYNCHRO если использовать - только тогда FAR уснет?

Ну и тогда вопрос - синхронно опрос получается не сделать в таком случае - придется вешать коллбэк?
Last edited by ionic on Mon 11 Mar, 2019 13:28, edited 1 time in total.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Дождаться закрытия всех модальных диалогов

Post by Shmuel »

1. Скрипты всегда запускаются в основном потоке.
2. Far API (за малыми исключениями) запрещено использовать из неосновных потоков.
3. Синхронно - это значит, что пока ваш скрипт что-то делает, весь остальной Фар ждёт.
ionic
Posts: 19
Joined: Mon 04 Mar, 2019 21:29
Been thanked: 1 time

Дождаться закрытия всех модальных диалогов

Post by ionic »

Понял.
Про синхронно - имел ввиду, что без коллбэков, в основном потоке скрипта.

А если я через Keys отдаю клавиатурную команду, как тогда сделать паузу, чтобы команда успела обработаться, если Sleep уводит весь фар в паузу?
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Дождаться закрытия всех модальных диалогов

Post by Shmuel »

ionic wrote: Mon 11 Mar, 2019 15:39 как тогда сделать паузу, чтобы команда успела обработаться, если Sleep уводит весь фар в паузу?
Не надо паузы, Фар не возвратит управление, покуда команда не обработается.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Дождаться закрытия всех модальных диалогов

Post by NightRoman »

Shmuel wrote: Mon 11 Mar, 2019 15:03 2. Far API (за малыми исключениями) запрещено использовать из неосновных потоков.
Тонкость. Фактически запрещено из параллельных. Из неосновных можно, но все остальные потоки, включая основной, не должны вызывать Far API в то же время.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Дождаться закрытия всех модальных диалогов

Post by DrKnS »

NightRoman wrote: Mon 11 Mar, 2019 17:00Из неосновных можно
"Официально" нельзя ничего вообще, всё на свой страх и риск, блаблабла.

ionic
Posts: 19
Joined: Mon 04 Mar, 2019 21:29
Been thanked: 1 time

Дождаться закрытия всех модальных диалогов

Post by ionic »

Вобщем, опять дикая проблема на простом месте.

Написал ожидание закрытия даилога через таймеры.
Переделал всю логику на коллбэки. Внутри них есть вызов фии Keys что, естественно, приводит к ошибке "yield".
macropost мне не подходит, так как он ставит макро в очередь, а не исполняет в текущем времени.

Вопрос остается открытым - либо как сделать ожидание в главном треде скрипта, или как вызвать Keys внутри коллбэка таймера.
Last edited by ionic on Tue 12 Mar, 2019 10:50, edited 1 time in total.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Дождаться закрытия всех модальных диалогов

Post by Shmuel »

ionic, посмотрите на код этого скрипта (это старая версия, но идея должна быть понятна).
ionic
Posts: 19
Joined: Mon 04 Mar, 2019 21:29
Been thanked: 1 time

Дождаться закрытия всех модальных диалогов

Post by ionic »

Shmuel wrote: Tue 12 Mar, 2019 11:00 посмотрите на код этого скрипта
Благодарю, этот скрипт я смотрел, но есть две проблемы:
1) я не уверен, что диалог, вызываемый в NetBox (или в каком-либо другом панельном плагине) по F5 будет всегда иметь GUID диалога Copy
2) у меня скрипт вызывается через lua:@, т.е. "Event" я там использовать не могу - может быть есть пример, где можно посмотреть, как использовать подписку на события без Event?
ionic
Posts: 19
Joined: Mon 04 Mar, 2019 21:29
Been thanked: 1 time

Дождаться закрытия всех модальных диалогов

Post by ionic »

На данный момент решил проблему через "ж".

Вот функция ожидания, которая позволяет синхронно (не покидая потока скрипта) ждать, например, закрытия диалога копирования

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.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Дождаться закрытия всех модальных диалогов

Post by John Doe »

ionic wrote: Tue 12 Mar, 2019 12:18 На данный момент решил проблему через "ж".
Напрасно.
Post Reply

Return to “Нужна помощь”