ACTL_SYNCHRO

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

ACTL_SYNCHRO

Post 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 какой-нибудь привести в качестве примера? Какие возможности это дает плагину или какие известные проблемы решает?
User avatar
Andrey Budko
Posts: 1203
Joined: Fri 01 Apr, 2005 14:03
Contact:

Re: About ACTL_SYNCHRO

Post by Andrey Budko »

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

тут: http://code.google.com/p/evil-programme ... loads/list
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: About ACTL_SYNCHRO

Post by zg »

NightRoman wrote:Выглядит интересно. А можно use case scenario какой-нибудь привести в качестве примера? Какие возможности это дает плагину или какие известные проблемы решает?
1. в clipcopy уже есть пример использования.
2. возможность полноценно использовать диалоги для прогрессов. т.е. в потоке например копируем, переодически посылая actl_synchro. в обработчике processsynchroevent посылаем мессагу диалогу, диалог перерисовывает прогресс. в принципе вот этот пункт и был изначальным стимулом.
3. в панельных плагинах можно динамически обновлять содержимое панели. тот же процлист.
4. не задумывалось, но насколько я знаю, есть плагины, которые себя зовут через actl_postmacro. тут выходит более простой вариант.
5. редактор кто-то там хотел рефрешить :)
6. банальная возможность дёргать апи из потоков. понятно что не напрямую, но должно хватать :) если не хватит, никто не мешает в будущем добавить SE_SPECIALSYNCHRO.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: About ACTL_SYNCHRO

Post by NightRoman »

Andrey Budko, zg
Спасибо и за пример, и пояснения, наверное, этого достаточно. Да, заманчиво, надо будет из этого пользу извлечь безусловно.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: About ACTL_SYNCHRO

Post by NightRoman »

Впрочем, есть еще пара технических вопросов.
1) Насколько "мгновенно" этот перевызов в главном потоке произойдет?
2) А если ACTL_SYNCHRO из главного потока и вызывается, то перевызов будет сразу или таки текущий вызов плагина сначала будет закончен, управление вернется Фару и вот только тогда Фар вызовет callback плагина?
User avatar
CrOm
Posts: 1428
Joined: Tue 02 Aug, 2005 21:02
Location: Омск
Been thanked: 1 time

Re: About ACTL_SYNCHRO

Post by CrOm »

ваще спасибо за функционал у меня в куплее очень пригодится. правда в 1.75 нету такого
FARFlipper, FARdroid, qPlayEx, Mr.Ripper
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: About ACTL_SYNCHRO

Post by NightRoman »

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

Попробую перефразировать еще так. Мой плагин вызван из меню, допустим. Он вызывает ACTL_SYNCHRO, потом запускает модальный диалог и все. Когда будет вызвана моя ProcessSynchroEventW - до запуска диалога, после или как повезет?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: About ACTL_SYNCHRO

Post by NightRoman »

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

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

Пока по моим экспериментам вроде - да. Но это может быть и случайно и слишком мало экспериментов, потому и "везет". Потому и жду официального ответа.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: About ACTL_SYNCHRO

Post by zg »

проверка на вызов processsyncroevent проводится в GetInputRecord. т.е. гарантированного времени отклика нет, но всё достаточно быстро и должно хватать. если кому-то не хватит, пишите обоснование, буду думать.
дёрганье из основного потока. если плагин дёрнул и до выхода ничего интерактивного не вызывал, processsyncroevent вызовется после выхода. если скажем показал диалог, то в момент показа диалога.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: About ACTL_SYNCHRO

Post by NightRoman »

zg
В GetInputRecord - это кажется очень, очень хорошо. Не надо менять это *дефолтное* поведение, оно очень полезно (позволит избежать многих некрасивых хитростей с известной задачкой самоперевызова плагина). Если кому и понадобится более быстрый отклик (еще и не факт), это лучше будет другой операцией сделать. Вобщем, функционал очень полезный получается, причем пока я даже только про это:
4. не задумывалось, но насколько я знаю, есть плагины, которые себя зовут через actl_postmacro. тут выходит более простой вариант.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: About ACTL_SYNCHRO

Post by Shmuel »

zg wrote: 2. возможность полноценно использовать диалоги для прогрессов. т.е. в потоке например копируем, переодически посылая actl_synchro. в обработчике processsynchroevent посылаем мессагу диалогу, диалог перерисовывает прогресс. в принципе вот этот пункт и был изначальным стимулом.
А как обработчик ProcessSynchroEvent узнаёт хэндл диалога, через глобальную переменную, устанавливаемую при получении DN_INITDIALOG, или есть более элегантный способ?
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: About ACTL_SYNCHRO

Post by t-rex »

У ProcessSynchroEvent есть void *Param
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: About ACTL_SYNCHRO

Post by Shmuel »

Но этот Param передаётся из другого потока, откуда другой поток знает хэндл диалога?
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: About ACTL_SYNCHRO

Post by zg »

Shmuel wrote:Но этот Param передаётся из другого потока, откуда другой поток знает хэндл диалога?
в CreateThread void* param тоже есть.
Shmuel
Posts: 6820
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Re: About ACTL_SYNCHRO

Post by Shmuel »

Спасибо, теперь понятно.
Post Reply

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