Page 1 of 2

ACTL_SYNCHRO

Posted: Mon 22 Jun, 2009 10:56
by NightRoman
zg 21.06.2009 18:08:33 +0200 - build 1005

1. новое апи. позволяет потоку, запущенному плагином выполнить код в контексте главного потока фара.
поток может вызвать Info.AdvControl(Info.ModuleNumber,ACTL_SYNCHRO,Param).
если плагин экспортирует функцию ProcessSynchroEventW то она будет вызвана в контексте главного потока.
первый параметр при этом будет равен SE_COMMONSYNCHRO (обязательно нужно проверять), второй - Param, переданный AdvControl.
ProcessSynchroEventW должна возвращать 0.
zg
Выглядит интересно. А можно use case scenario какой-нибудь привести в качестве примера? Какие возможности это дает плагину или какие известные проблемы решает?

Re: About ACTL_SYNCHRO

Posted: Mon 22 Jun, 2009 11:10
by Andrey Budko
NightRoman wrote:Выглядит интересно. А можно use case scenario какой-нибудь привести в качестве примера? Какие возможности это дает плагину или какие известные проблемы решает?
Смотри сорцы клипкопи "до" и "после". Было небезопасно и на авось, стало безопасно и красиво.

тут: http://code.google.com/p/evil-programme ... loads/list

Re: About ACTL_SYNCHRO

Posted: Mon 22 Jun, 2009 11:15
by zg
NightRoman wrote:Выглядит интересно. А можно use case scenario какой-нибудь привести в качестве примера? Какие возможности это дает плагину или какие известные проблемы решает?
1. в clipcopy уже есть пример использования.
2. возможность полноценно использовать диалоги для прогрессов. т.е. в потоке например копируем, переодически посылая actl_synchro. в обработчике processsynchroevent посылаем мессагу диалогу, диалог перерисовывает прогресс. в принципе вот этот пункт и был изначальным стимулом.
3. в панельных плагинах можно динамически обновлять содержимое панели. тот же процлист.
4. не задумывалось, но насколько я знаю, есть плагины, которые себя зовут через actl_postmacro. тут выходит более простой вариант.
5. редактор кто-то там хотел рефрешить :)
6. банальная возможность дёргать апи из потоков. понятно что не напрямую, но должно хватать :) если не хватит, никто не мешает в будущем добавить SE_SPECIALSYNCHRO.

Re: About ACTL_SYNCHRO

Posted: Mon 22 Jun, 2009 11:26
by NightRoman
Andrey Budko, zg
Спасибо и за пример, и пояснения, наверное, этого достаточно. Да, заманчиво, надо будет из этого пользу извлечь безусловно.

Re: About ACTL_SYNCHRO

Posted: Mon 22 Jun, 2009 11:40
by NightRoman
Впрочем, есть еще пара технических вопросов.
1) Насколько "мгновенно" этот перевызов в главном потоке произойдет?
2) А если ACTL_SYNCHRO из главного потока и вызывается, то перевызов будет сразу или таки текущий вызов плагина сначала будет закончен, управление вернется Фару и вот только тогда Фар вызовет callback плагина?

Re: About ACTL_SYNCHRO

Posted: Mon 22 Jun, 2009 11:44
by CrOm
ваще спасибо за функционал у меня в куплее очень пригодится. правда в 1.75 нету такого

Re: About ACTL_SYNCHRO

Posted: Mon 22 Jun, 2009 12:21
by NightRoman
NightRoman wrote:Впрочем, есть еще пара технических вопросов.
1) Насколько "мгновенно" этот перевызов в главном потоке произойдет?
2) А если ACTL_SYNCHRO из главного потока и вызывается, то перевызов будет сразу или таки текущий вызов плагина сначала будет закончен, управление вернется Фару и вот только тогда Фар вызовет callback плагина?
Попробую перефразировать. Можно ли считать, что ProcessSynchroEventW будет вызвана примерно тогда, когда Фар проигрывает клавиши или макросы из очереди, если таковые есть?

Попробую перефразировать еще так. Мой плагин вызван из меню, допустим. Он вызывает ACTL_SYNCHRO, потом запускает модальный диалог и все. Когда будет вызвана моя ProcessSynchroEventW - до запуска диалога, после или как повезет?

Re: About ACTL_SYNCHRO

Posted: Mon 22 Jun, 2009 17:12
by NightRoman
И такой вопрос. Реализует ли это нововведение то, о чем просилось вот тут:
http://forum.farmanager.com/viewtopic.php?f=8&t=3890
.. другим способом, и побочно, конечно

(правда ответ опять наверное упирается в то, когда именно колбек вызывается)

Пока по моим экспериментам вроде - да. Но это может быть и случайно и слишком мало экспериментов, потому и "везет". Потому и жду официального ответа.

Re: About ACTL_SYNCHRO

Posted: Mon 22 Jun, 2009 19:34
by zg
проверка на вызов processsyncroevent проводится в GetInputRecord. т.е. гарантированного времени отклика нет, но всё достаточно быстро и должно хватать. если кому-то не хватит, пишите обоснование, буду думать.
дёрганье из основного потока. если плагин дёрнул и до выхода ничего интерактивного не вызывал, processsyncroevent вызовется после выхода. если скажем показал диалог, то в момент показа диалога.

Re: About ACTL_SYNCHRO

Posted: Tue 23 Jun, 2009 10:21
by NightRoman
zg
В GetInputRecord - это кажется очень, очень хорошо. Не надо менять это *дефолтное* поведение, оно очень полезно (позволит избежать многих некрасивых хитростей с известной задачкой самоперевызова плагина). Если кому и понадобится более быстрый отклик (еще и не факт), это лучше будет другой операцией сделать. Вобщем, функционал очень полезный получается, причем пока я даже только про это:
4. не задумывалось, но насколько я знаю, есть плагины, которые себя зовут через actl_postmacro. тут выходит более простой вариант.

Re: About ACTL_SYNCHRO

Posted: Sat 10 Apr, 2010 21:52
by Shmuel
zg wrote: 2. возможность полноценно использовать диалоги для прогрессов. т.е. в потоке например копируем, переодически посылая actl_synchro. в обработчике processsynchroevent посылаем мессагу диалогу, диалог перерисовывает прогресс. в принципе вот этот пункт и был изначальным стимулом.
А как обработчик ProcessSynchroEvent узнаёт хэндл диалога, через глобальную переменную, устанавливаемую при получении DN_INITDIALOG, или есть более элегантный способ?

Re: About ACTL_SYNCHRO

Posted: Sat 10 Apr, 2010 22:08
by t-rex
У ProcessSynchroEvent есть void *Param

Re: About ACTL_SYNCHRO

Posted: Sat 10 Apr, 2010 22:13
by Shmuel
Но этот Param передаётся из другого потока, откуда другой поток знает хэндл диалога?

Re: About ACTL_SYNCHRO

Posted: Sat 10 Apr, 2010 22:38
by zg
Shmuel wrote:Но этот Param передаётся из другого потока, откуда другой поток знает хэндл диалога?
в CreateThread void* param тоже есть.

Re: About ACTL_SYNCHRO

Posted: Sat 10 Apr, 2010 22:48
by Shmuel
Спасибо, теперь понятно.