Что нового

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

Webarion

Знающий
Сообщения
101
Репутация
9
Версия 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 МБ · Просмотры: 3
  • Connector132.zip
    1.2 МБ · Просмотры: 2
Последнее редактирование:

joiner

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

Webarion

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

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

CreatoR

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

Webarion

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

CreatoR

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

Webarion

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

CreatoR

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

Вложения

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

Webarion

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

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

tonycstech

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

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

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

Webarion

Знающий
Сообщения
101
Репутация
9
Открыл 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.
 
Последнее редактирование:
Верх