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

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

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

Post by ionic » Mon 11 Mar, 2019 08:05

День добрый!
Может кто знает, как можно в lua-скрипте дождаться закрытия всех текущих модальных диалогов?
Т.е. мне неизвестен GUID диалога.
Зачем нужно - вызываю диалог копирования файлов - он может быть как нативный фара, так и, например, NetBox-а.
Скрипту требуется дождаться окончания копирования файлов.

Shmuel
Posts: 5896
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 217 times

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

Post by Shmuel » Mon 11 Mar, 2019 09:25

Вариант 1: обрабатывать 2, 3 или сколько нужно гуидов диалогов одновременно.
Вариант 2: воспользоваться функцией far.Timer с периодом, скажем 100ms и ловить ситуацию not Area.Dialog.

ionic
Posts: 19
Joined: Mon 04 Mar, 2019 21:29

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

Post by ionic » Mon 11 Mar, 2019 11:28

Спасибо.
Где-то почитать про 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: 5896
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 217 times

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

Post by Shmuel » Mon 11 Mar, 2019 12:40

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

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

Post by ionic » Mon 11 Mar, 2019 13:27

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

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

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

Ну и тогда вопрос - синхронно опрос получается не сделать в таком случае - придется вешать коллбэк?
Last edited by ionic on Mon 11 Mar, 2019 13:28, edited 1 time in total.

Shmuel
Posts: 5896
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 217 times

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

Post by Shmuel » Mon 11 Mar, 2019 15:03

1. Скрипты всегда запускаются в основном потоке.
2. Far API (за малыми исключениями) запрещено использовать из неосновных потоков.
3. Синхронно - это значит, что пока ваш скрипт что-то делает, весь остальной Фар ждёт.

ionic
Posts: 19
Joined: Mon 04 Mar, 2019 21:29

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

Post by ionic » Mon 11 Mar, 2019 15:39

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

А если я через Keys отдаю клавиатурную команду, как тогда сделать паузу, чтобы команда успела обработаться, если Sleep уводит весь фар в паузу?

Shmuel
Posts: 5896
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 217 times

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

Post by Shmuel » Mon 11 Mar, 2019 16:40

ionic wrote:
Mon 11 Mar, 2019 15:39
как тогда сделать паузу, чтобы команда успела обработаться, если Sleep уводит весь фар в паузу?
Не надо паузы, Фар не возвратит управление, покуда команда не обработается.

User avatar
NightRoman
Posts: 5911
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 10 times
Been thanked: 11 times
Contact:

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

Post by NightRoman » Mon 11 Mar, 2019 17:00

Shmuel wrote:
Mon 11 Mar, 2019 15:03
2. Far API (за малыми исключениями) запрещено использовать из неосновных потоков.
Тонкость. Фактически запрещено из параллельных. Из неосновных можно, но все остальные потоки, включая основной, не должны вызывать Far API в то же время.

User avatar
DrKnS
Posts: 5396
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 6 times
Been thanked: 227 times

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

Post by DrKnS » Mon 11 Mar, 2019 18:35

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


ionic
Posts: 19
Joined: Mon 04 Mar, 2019 21:29

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

Post by ionic » Tue 12 Mar, 2019 10:48

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

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

Вопрос остается открытым - либо как сделать ожидание в главном треде скрипта, или как вызвать Keys внутри коллбэка таймера.
Last edited by ionic on Tue 12 Mar, 2019 10:50, edited 1 time in total.

Shmuel
Posts: 5896
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 217 times

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

Post by Shmuel » Tue 12 Mar, 2019 11:00

ionic, посмотрите на код этого скрипта (это старая версия, но идея должна быть понятна).

ionic
Posts: 19
Joined: Mon 04 Mar, 2019 21:29

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

Post by ionic » Tue 12 Mar, 2019 11:11

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

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

Post by ionic » Tue 12 Mar, 2019 12:18

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

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

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: 12457
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 188 times

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

Post by John Doe » Tue 12 Mar, 2019 12:55

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

ionic
Posts: 19
Joined: Mon 04 Mar, 2019 21:29

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

Post by ionic » Tue 12 Mar, 2019 13:15

John Doe wrote:
Tue 12 Mar, 2019 12:55
Напрасно
Могу поинтересоваться ненапрасным решением?
Last edited by ionic on Tue 12 Mar, 2019 13:21, edited 1 time in total.

Post Reply

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