Что нового

Connector - интеракция. Взаимодействие между скриптами и процессами

Webarion

Осваивающий
Сообщения
143
Репутация
24
Версия AutoIt
3.3.14.5
Версия
2.0.2
Библиотека, для взаимодействия между процессами. Подходит для постоянного, множественного взаимообмена данных.

Особенности:
  1. Множественное взаимодействие между участниками*
  2. Типы передачи данных: Int32, Int64, String, Double, Boolean, Binary, hWhd, Ptr, Keyword, Array.
  3. Поддерживаются многомерные массивы. В сборке по умолчанию, поддерживаются 5-мерные массивы. Есть возможность расширить до 255 измерений.
  4. Поддержка группового общения. Это как public и private. Возможность взаимодействия между всеми участниками, включёнными в Connector, но возможно, создать и отдельную группу.
  5. Возможность назначить общий приёмник, для всех входящих, в текущем процессе.
  6. Возможность назначить приёмник для входящих, только ОТ определённого участника.
  7. Возможность назначить приёмник для входящих, только ДЛЯ определённого получателя.
  8. Возможность автоматического запуска получателя по указанному пути.
  9. Возможность закрыть процесс получателя, после получения ответа.
  10. Возможность минимизировать скрипт и выбрать функционал, с помощью сборщика Packager.au3
* -Участники, это скрипты, функции, или процессы, которым нужно обмениваться данными. Ими являются, как отдельные процессы, так и скрипты загруженные через #include (подходит, когда необходимо организовать, как системные, так и пользовательские плагины, модули в одинаковой архитектуре)

Примечание:
  • не предназначен для взаимодействия со сторонними процессами не использующими Connector.
  • Не поддерживаются вложенные массивы, внутри массивов.
Основной принцип пересылки, в данной ветке Connector 2.x.x заключается в передаче данных в структуре(памяти).
Если в более ранних версиях, каждый элемент массива комплектовался как wchar[x]. То, в данной версии, типы данных, не занимают, размер больший, чем им необходимо. Например: Bool и Keyword, занимают 1 байт; Число 123456789, раньше занимало 18 байт, сейчас, как и положено, это стандартный Int(4 байта)
v2.0.2
Кодировка всех скриптов изменена на UTF-8
v2.0.1
Небольшие корректировки кода.
v2.0.0
Первая версия этой ветки
Полностью обновлён способ отправки и получения данных. Все заявленные типы данных передаются в структуре,соответственно своему размеру.
Добавлен сборщик коннектора Packager.au3, позволяющий сжать скрипт библиотеки или выбрать необходимый функционал.
Поддержка пятимерных массивов в версии по умолчанию.
Добавлена возможность изменить количество поддерживаемых измерений массива через сборщик Packager.au3
Основной принцип пересылки, в данной ветке Connector 1.x.x заключается в преобразовании отправляемых типов данных в простую строку, после пересылки строка снова собирается в переменную с тем типом данных, который был послан отправителем.
v1.3.2
Кодировка библиотеки и примеров изменена на UTF-8
v1.3.1
* Добавлена поддержка Int64
* Исправлен баг с типом Ptr
* Исправлен баг с передачей типов внутри массива
v1.2.0
* исправлена ошибка, появляющаяся при добавлении | в массив
* исправлена небольшая логика, с возвратом ошибки от отправителя
v1.1.0
* исправлен функционал с ожиданием получателя
* добавлена возможность запуска процесса получателя по указанному пути
* добавлено несколько примеров
v1.0.0
* Первая опубликованная версия
Connector vA.B.C
A
- ветка больших изменений. Принципиально нового функционала, новой логики.
B - ветка изменений, добавления функций в общей логике, корректировок кода, исправления багов.
C - ветка минимальных исправлений, комментарии, мелкие ошибки.
 
Автор
Webarion

Вложения

  • Connector202.zip
    2 МБ · Просмотры: 41
  • Connector132.zip
    1.2 МБ · Просмотры: 10
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
по сути то передает строки со спец обозначением. а приемник их переворачивает в нужный тип данных
есть баг
если один отправляет, второй принимает - при выгрузке принимающей стороны невозможно отключить отправляющего. не реагирует на стоп
 
Последнее редактирование:
  • Like
Реакции: xXx
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
по сути то передает строки со спец обозначением. а приемник их переворачивает в нужный тип данных
есть баг
если один отправляет, второй принимает - при выгрузке принимающей стороны невозможно отключить отправляющего. не реагирует на стоп
По сути да, в версиях 1.x.x тело передачи, это строка, но, до адресата доходит то, что требуется. Никак не получалось вернуть правильные данные, поэтому решил использовать такой способ. По сути, машинный код в памяти делает тоже самое, байт, есть байт, а, тип сохраняемой последовательности в памяти, нужно определять метками.

Проблема со стопом, это проблема, возникающая при ожидании получателя через WinWait, в этот момент, нет реакции на кнопки. Думаю об этом сейчас. Ещё один момент обнаружил, тоже разбираюсь.
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Хорошая версия.
Про типы данных, я тут вспомнил про свою похожую библиотеку которую делал давно (Container), так вот там через свойство PutProperty можно передать любой тип данных, просто на 10-ке у меня библиотека отказывается работать, нужно видимо что то ещё там учитывать.
 
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
Обновил библиотеку. Решены выявленные проблемы. Добавлено несколько примеров.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Есть проблема с передачей массивов (я кстати тоже с ней сталкивался когда пытался делать поддержку передачи массивов) - если в элементе массива присутствует символ разделителя (|), то естественно будет создан дополнительный элемент на этапе конвертирования строки обратно в массив.
 
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
Есть проблема с передачей массивов (я кстати тоже с ней сталкивался когда пытался делать поддержку передачи массивов) - если в элементе массива присутствует символ разделителя (|), то естественно будет создан дополнительный элемент на этапе конвертирования строки обратно в массив.
Да, я понял) Спасибо дружище! Я предполагал, что до этого дойдёт) Были мысли сделать эту фильтрацию, просто вылетело из головы, тупо забыл. Как всегда, на потом, оставляешь штуки, которые считаешь важными, но менее приоритетными, а потом, забываешь про них. Прошу прощения! Всё будет в новой версии) Благодарю тебя, что помог мне вспомнить об этом!
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Прикрепил свой вариант упаковки переменных (поддерживаются двумерные массивы). Позже выложу отдельно.
 

Вложения

  • Variant UDF.zip
    2.4 КБ · Просмотры: 5
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
Есть проблема с передачей массивов (я кстати тоже с ней сталкивался когда пытался делать поддержку передачи массивов) - если в элементе массива присутствует символ разделителя (|), то естественно будет создан дополнительный элемент на этапе конвертирования строки обратно в массив.
Исправил.
Сообщение автоматически объединено:

Выпустил обновление и ветку номер 2. Цель ветки, передача данных, соответственно их минимальному размеру в памяти.
Благодарность CreatoR, За идею возврата данных, из WM_COPYDATA
 
Последнее редактирование:

tonycstech

Новичок
Сообщения
94
Репутация
3
Открыл Connector.au3 инструкции читать не возможно, одни иероглифы. Ñëóæèò äëÿ îáìåíà äàííûìè ìåæäó ïðîöåññàìè итд итп
Сохрание файл с Encoding UTF-8 With BOM

Я так понял эта штука позволяет 2м скриптам разговаривать ?
Очень интересно.
Есть ли пример элементарной передачи информации от одного к другому без всяких интерфейсов итд итп ?
Типа одна или двух строчек чтобы была понятна концепция для недоразвитых програмистов типа меня ?

Спасибо.
Очень интересная штука.
 
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
Открыл Connector.au3 инструкции читать не возможно, одни иероглифы. Ñëóæèò äëÿ îáìåíà äàííûìè ìåæäó ïðîöåññàìè итд итп
Обновил версии на 1.3.2 и 2.0.2. Теперь библиотека и примеры в кодировке UTF-8
Есть ли пример элементарной передачи информации от одного к другому без всяких интерфейсов итд итп ?
Там есть самый простой пример, в папке "2 Простой пример"
Сообщение автоматически объединено:

Типа одна или двух строчек чтобы была понятна концепция
Концепция следующая:
Для начала, скрипт, который должен взаимодействовать с другими (далее участник), нужно зарегистрировать в Connector , указав уникальный идентификатор. Делается это так:
Код:
_Add_Member_Connector('MyScriptID')

MyScriptID - идентификатор. Любой уникальный набор символов.
Эта регистрация должна существовать для каждого участника.

Далее, для того, чтобы получать в любой момент времени, сообщения от другого участника, нужно зарегистрировать и создать функцию. Делается это так:

Код:
_Function_Receiver_Connector('_Receiver') ; Регистрируем функцию, которая будет выполняться, если текущий скрипт получит какое-либо сообщение
; ... какой-то код
; Функция получения входящих. Указана в _Function_Receiver_Connector
; $vMsg - получаемое сообщение(переменная)
; $sNameSender - уникальное имя участника, от которого пришло сообщение
Func _Receiver($vMsg, $sNameSender)
    Return 'Отвечаю!'; Возвращаем ответ отправителю
EndFunc

Ну, и в тот момент, когда необходимо отправить сообщение, отправляем так:
Код:
_Send_Connector('Привет!', 'RecipientScriptID') ; если нужно просто отправить сообщение
$vResponse = _Send_Connector('Привет!', 'RecipientScriptID'); если нужно отправить сообщение и получить ответ

RecipientScriptID - уникальный идентификатор получателя, который в другом скрипте, был зарегистрирован через _Add_Member_Connector
В переменной $vResponse будет ответ, который вернул участник с идентификатором RecipientScriptID.
Сообщение автоматически объединено:

Пример простого скрипта:
Код:
#include 'Connector_Full.au3' ; подключаем Connector

Global $sThis_ID = 'Script1' ; Идентификатор текущего скрипта
Global $sSend_ID = 'Script2' ; Идентификатор скрипта, которому будет отправляться сообщение

_Add_Member_Connector($sThis_ID) ; Регистрируем текущий скрипт в Connector
_Function_Receiver_Connector('_Receiver') ; Регистрируем функцию, которая будет выполняться, если текущий скрипт получит какое-либо сообщение

; Посылаем сообщение "Привет!" скрипту с идентификатором указанным в переменной $sSend_ID
Local $vResponse = _Send_Connector('Привет!', $sSend_ID)

If @error = 1 Then
    ; Показываем всплывающее сообщение, если недоступен скрипт-получатель с идентификатором $sSend_ID
    ; это не позволит завершить скрипт и дождаться появление второго скрипта.
    ; Второй скрипт, запустившись, увидит текущий, отправит ему сообщение и получит ответ
    MsgBox(0, $sThis_ID, 'Запустите ' & $sSend_ID & ' не закрывая это окно')
Else
    ; Показываем всплывающее сообщение, с ответом
    MsgBox(0, $sThis_ID & ' отправил сообщение для ' & $sSend_ID, 'Ответ от ' & $sSend_ID & ': ' & @CRLF & $vResponse)
EndIf

; Функция получения входящих. Указана в _Function_Receiver_Connector
; $vMsg - получаемое сообщение(переменная)
; $sNameSender - уникальное имя участника, от которого пришло сообщение
Func _Receiver($vMsg, $sNameSender)
    Return 'Отвечаю!'; Возвращаем ответ отправителю
EndFunc

Этот пример можно использовать сразу в двух скриптах, всего лишь поменяв местами Script1 и Script2 в переменных $sThis_ID и $sSend_ID.
 
Последнее редактирование:

liond66

Новичок
Сообщения
117
Репутация
2
Покажите пример, или хотя бы алгоритм следующих ситуаций:
- послать в группу
- послать всем
- принять из группы
- принимать от всех

Спасибо.
 
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
Пример отправки в группу.
Отправитель:
Код:
#include 'Connector.au3'
_Set_Default_Group_ID_Connector("NewGroup") ; Привязка к группе.
Global $sThis_ID = 'App1'; Маркер отправителя
_Add_Member_Connector($sThis_ID); регистрация текущего участника
_Function_Receiver_Connector('_Receiver'); регистрирует функцию обработки входящих

#Region ПОСЛАТЬ В ГРУППУ
    $aAppsGroup = _Members_Group_Connector('NewGroup')
    Local $sResultMsg = ""; собираем ответ от всех
    For $sSend_ID In $aAppsGroup ; отправляем всем участникам группы
        Local $sMsg = 'Привет!'
        If $sSend_ID <> $sThis_ID Then
            Local $vResponse = _Send_Connector($sMsg, $sSend_ID); посылает сообщение $sMsg, для $sSend
            $sResultMsg &= "Сообщение для " & $sSend_ID & ": " & $sMsg & " Ответ: " & $vResponse & @CRLF
        EndIf
        Sleep(10)
    Next
    MsgBox(0, $sThis_ID, $sResultMsg)
#EndRegion ПОСЛАТЬ В ГРУППУ

Func _Receiver($vMsg, $sNameSender); Функция получения входящих. Указана в _Function_Receiver_Connector
    Return 'И тебя, той же палкой, по тому же месту!'; Возвращаем ответ отправителю
EndFunc

Получатели одинаковые. Должны отличаться только $sThis_ID:
Код:
#include 'Connector.au3'
Global $sThis_ID = 'App2'; идентификатор текущего процесса
_Set_Default_Group_ID_Connector("NewGroup") ; установить группу текущего процесса
_Add_Member_Connector($sThis_ID); регистрация участника
_Function_Receiver_Connector('_Receiver'); регистрирует функцию обработки входящих
MsgBox(0, $sThis_ID, 'Запустите скрипт App1 не закрывая это окно')
Func _Receiver($vMsg, $sNameSender); Функция получения входящих. Указана в _Function_Receiver_Connector
    Return 'И тебе привет от ' & $sThis_ID & '!'; Возвращаем ответ отправителю
EndFunc   ;==>_Receiver

Принять от всех(от любого участника):
Код:
_Function_Receiver_Connector('_Receiver')
; ...
Func _Receiver($vMsg, $sNameSender); Функция получения входящих. Указана в _Function_Receiver_Connector
    ; Какой-то код...
    Return 'Возвращение результата'
EndFunc   ;==>_Receiver


Остальные пункты предусмотрены не были. Подумаю об этом. Во всяком случае, в новой версии будет проще.
 
Последнее редактирование:

liond66

Новичок
Сообщения
117
Репутация
2
@Webarion
Спасибо за ваши разъяснения. Стало намного понятнее.
Остальные пункты предусмотрены не были.
Я наверно неправильно понял пункт 4 из первой темы. Уточните, что имелось ввиду?
Возможность взаимодействия между всеми участниками, включёнными в Connector, но возможно, создать и отдельную группу.
Я прикреплю расширенные примеры, как я вижу применение этой UDF.
Возможно это поможет кому нибудь, или у вас будут замечания.

И я заметил, что вы сменили фотографию в профиле :wink:

Я увидел функцию _All_Members_Connector().
Правильно ли я посылаю сообщения в несколько групп?
Есть ли возможность послать во ВСЕ группы?
Код:
#include <Array.au3>
#include 'Connector_Full.au3'

Global $sThis_ID = 'Sender' ; Маркер отправителя

_Set_Default_Group_ID_Connector("NewGroup") ; Привязка к группе.
_Add_Member_Connector($sThis_ID, "NewGroup") ; регистрация текущего участника
_Set_Default_Group_ID_Connector("SecondGroup") ; Привязка к группе.
_Add_Member_Connector($sThis_ID, "SecondGroup") ; регистрация текущего участника

#Region ПОСЛАТЬ В ГРУППУ
;$aAppsGroup = _Members_Group_Connector('NewGroup')
$aAppsGroup = _All_Members_Connector()
;_ArrayDisplay($aAppsGroup)
Local $sResultMsg = "" ; собираем ответ от всех
For $sSend_ID In $aAppsGroup ; отправляем всем участникам группы
    Local $sMsg = 'Привет!'
    ;Local $sMsg = 'End'
    If $sSend_ID <> $sThis_ID Then
        _Send_Connector($sMsg, $sSend_ID, $sThis_ID,"NewGroup") ; посылает сообщение $sMsg, для $sSend
        _Send_Connector($sMsg, $sSend_ID, $sThis_ID,"SecondGroup") ; посылает сообщение $sMsg, для $sSend
    EndIf
    Sleep(10)
Next
#EndRegion ПОСЛАТЬ В ГРУППУ
 

Вложения

  • 1-Послать всем в группе.rar
    17.4 КБ · Просмотры: 2
  • 2-Послать всем в группе - получить ответ.rar
    17.8 КБ · Просмотры: 2
  • 3-Получить от любого в группе.rar
    17.3 КБ · Просмотры: 3
Последнее редактирование:
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
Уточните, что имелось ввиду?
Допустим, есть несколько проектов и в каждом несколько участников, между которыми должна быть интеракция. Каждый проект, можно привязать к своей группе, но при этом иметь возможность доступа к любому процессу в любом проекте, использующем Connector. Писал конечно, под свои нужды, мне просто так удобно было, не заморачиваться в проектах, с отсеиванием лишних участников. Сейчас логику обдумываю. В новой версии планируется поддержка вложенных друг в друга массивов, и отправка в группу одной строкой. Но когда выйдет, пока не знаю.
:smile:
Я увидел функцию _All_Members_Connector()
Кажется я её не доделал, она должна возвращать массив участников вместе с их группами, а не просто участников. В будущих версиях будет исправлено.
Правильно ли я посылаю сообщения в несколько групп?
Есть ли возможность послать во ВСЕ группы?
Сейчас, пока так:
Код:
; для версий Connector 2.0.2 и не выше 1.3.2
#include 'Connector_Full.au3'
Global $sThis_ID = 'Sender' ; Маркер отправителя

_Add_Member_Connector($sThis_ID, "NewGroup") ; регистрация текущего участника

#Region ПОСЛАТЬ ВСЕМ ВО ВСЕХ ГРУППАХ
    Local $aGroups = _All_Groups_Connector() ; получаем все группы
    For $g = 0 To UBound($aGroups) - 1 ; перечисляем группы
        Local $sGroup = $aGroups[$g]

;~         If Not StringRegExp($sGroup, 'Group1|GroupN') Then ContinueLoop ; Если нужно отправлять только в группы Group1 и GroupN
;~         If StringRegExp($sGroup, 'Group1|GroupN') Then ContinueLoop ; Если нужно исключить отправку в группы Group1 и GroupN

        Local $aMembers = _Members_Group_Connector($sGroup) ; получаем участников группы
        For $sSend_ID In $aMembers ; перечисляем их

            Local $sMsg = 'Привет!'
            If $sSend_ID <> $sThis_ID Then
                Local $vRet = _Send_Connector($sMsg, $sSend_ID, $sThis_ID, $sGroup) ; посылаем сообщение
                ConsoleWrite($vRet & @CRLF)
            EndIf
            Sleep(10)
        Next
    Next
#EndRegion ПОСЛАТЬ ВСЕМ ВО ВСЕХ ГРУППАХ
 

Вложения

  • FullSender.zip
    15.3 КБ · Просмотры: 2
Последнее редактирование:

liond66

Новичок
Сообщения
117
Репутация
2
Спасибо за ответы.
Удачи с новыми версиями!
Ждём :wink:
Сообщение автоматически объединено:

В случае если приходит более одного сообщения одновременно, пока обрабатывается первое сообщение, остальные теряются.
Можно ли с помощью этой UDF управлять очередью? Отмечать обработанные сообщения?
И если нет, какой UDF подойдет для асинхронного обмена сообщениями?
Спасибо.
 
Последнее редактирование:
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
В случае если приходит более одного сообщения одновременно, пока обрабатывается первое сообщение, остальные теряются.
Можно ли с помощью этой UDF управлять очередью? Отмечать обработанные сообщения?
И если нет, какой UDF подойдет для асинхронного обмена сообщениями?
Спасибо.
Вы могли бы это всё сделать в своих функциях передатчика и приёмника. Но, при достаточно высоком трафике, это не поможет. Здесь нужна многопоточность. И более всего подошла бы библиотека, использующая дополнительную dll для этого. Как известно, нативно AutoIt многопоточность не поддерживает.
 
Верх