Что нового

Коммуникация между процессами

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
AutoIt: 3.3.0.0
Версия: 1.1

Категория: Интеракция

Описание: Позволяет организовать коммуникацию между двумя и более процессами посредством передачи сообщений, основанной на WM_COPYDATA. При отправке сообщения другому процессу создается очередь сообщений, которые будут переодически посылаться указанному процессу через заданный интервал времени до тех пор, пока не будет получено подтверждение об успешном приеме сообщения. Таким образом, сообщения не будут потеряны в случае невозможности их приема программой-приемником. Библиотека может сильно упростить работу с подобного рода задачами, особенно для начинающих. Как все это работает показано в примере, приведенном ниже (перед запуском, код необходимо откомпилировать в исполняемый (EXE) файл).

Пример:
Код:
#Include <EditConstants.au3>
#Include <GUIConstantsEx.au3>
#Include <GUIEdit.au3>
#Include <GUISlider.au3>
#Include <StaticConstants.au3>
#Include <WindowsConstants.au3>
#Include <Messages.au3>

#NoTrayIcon

If Not @compiled Then
    MsgBox(64, 'Messages UDF Library Demonstration', 'To run this script, you must first compile it and then run the (.exe) file.')
    Exit
EndIf

Opt('MustDeclareVars', 1)

If $CmdLine[0] = 0 Then
    ShellExecute(@ScriptFullPath, '1')
    ShellExecute(@ScriptFullPath, '2')
    ShellExecute(@ScriptFullPath, '3')
    Exit
EndIf

Global $Form, $Input1, $Input2, $Radio1, $Radio2, $Radio3, $ButtonSend, $Edit, $Slider, $Check

Switch $CmdLine[1]
    Case '1', '2', '3'
        _Main(Int($CmdLine[1]))
    Case Else

EndSwitch

Func _Main($Index)

    Local $GUIMsg, $nScript, $Data, $Timer = _MsgTimerInterval(0)

    $Form = GUICreate('Script' & $Index, 324, 384, (@DesktopWidth - 1018) / 2 + ($Index - 1) * 344, (@DesktopHeight - 440) / 2, BitOR($WS_CAPTION, $WS_SYSMENU), $WS_EX_TOPMOST)

    GUISetFont(8.5, 400, 0, 'Tahoma', $Form)

    GUICtrlCreateLabel('Message:', 14, 22, 48, 14)
    $Input1 = GUICtrlCreateInput('', 64, 19, 246, 20)
    GUICtrlCreateLabel('Send to:', 14, 56, 48, 14)

    GUIStartGroup()

    $Radio1 = GUICtrlCreateRadio('Script1', 64, 56, 56, 14)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $Radio2 = GUICtrlCreateRadio('Script2', 130, 56, 56, 14)
    $Radio3 = GUICtrlCreateRadio('Script3', 196, 56, 56, 14)

    $ButtonSend = GUICtrlCreateButton('Send', 236, 88, 75, 23)
    GUICtrlSetState(-1, $GUI_DEFBUTTON)
    GUICtrlCreateLabel('', 14, 128, 299, 2, $SS_ETCHEDHORZ)
    GUICtrlCreateLabel('Received message:', 14, 142, 98, 14)
    $Edit = GUICtrlCreateEdit('', 14, 160, 296, 129, BitOR($ES_READONLY, $WS_VSCROLL, $WS_HSCROLL))
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    GUICtrlCreateLabel('Timer interval (ms):', 14, 316, 98, 14)
    $Slider = GUICtrlCreateSlider(110, 312, 162, 26, BitOR($TBS_AUTOTICKS, $WS_TABSTOP))
    GUICtrlSetLimit(-1, 20, 1)
    GUICtrlSetData(-1, $Timer / 50)
    _GUICtrlSlider_SetTicFreq(-1, 1)
    $Input2 = GUICtrlCreateInput($Timer, 274, 313, 36, 20, $ES_READONLY)
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    $Check = GUICtrlCreateCheckbox('Enable receiver', 14, 354, 96, 19)
    GUICtrlSetState(-1, $GUI_CHECKED)

    Opt('GUICloseOnESC', 0)

    GUISetState()

    _MsgRegister('Script' & $Index, '_Receiver')

    While 1
        $GUIMsg = GUIGetMsg()
        Select
            Case $GUIMsg = $GUI_EVENT_CLOSE
                Exit
            Case $GUIMsg = $ButtonSend
                For $i = $Radio1 To $Radio3
                    If GUICtrlRead($i) = $GUI_CHECKED Then
                        $nScript = 1 + $i - $Radio1
                        ExitLoop
                    EndIf
                Next
                $Data = GUICtrlRead($Input1)
                If StringStripWS($Data, 3) = '' Then
                    $Data = '(empty)'
                EndIf
                If _IsReceiver('Script' & $nScript) Then
                    _MsgSend('Script' & $nScript, 'From Script' & $Index & ':  ' & $Data)
                EndIf
            Case $GUIMsg = $Slider
                _MsgTimerInterval($Timer)
            Case $GUIMsg = $Check
                If GUICtrlRead($Check) = $GUI_CHECKED Then
                    _MsgRegister('Script' & $Index, '_Receiver')
                    GUICtrlSetState($Edit, $GUI_ENABLE)
                    GUICtrlSetBkColor($Edit, 0xFFFFFF)
                    GUICtrlSetState($Slider, $GUI_ENABLE)
                    GUICtrlSetState($Input2, $GUI_ENABLE)
                Else
                    _MsgRegister('Script' & $Index, '')
                    GUICtrlSetState($Edit, $GUI_DISABLE)
                    GUICtrlSetBkColor($Edit, $GUI_BKCOLOR_TRANSPARENT)
                    GUICtrlSetState($Slider, $GUI_DISABLE)
                    GUICtrlSetState($Input2, $GUI_DISABLE)
                EndIf
        EndSelect
        $Data = GUICtrlRead($Slider) * 50
        If BitXOR($Data, $Timer) Then
            GUICtrlSetData($Input2, $Timer)
            $Timer = $Data
        EndIf
    WEnd
EndFunc   ;==>_Main

Func _Receiver($sMessage)
    _GUICtrlEdit_AppendText($Edit, $sMessage & @CRLF)
    Return 0
EndFunc   ;==>_Receiver

Скриншот:

Messages.png

Источник: Messages UDF (оффициальный форум)
Автор: Yashied
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied
Хороший пример.

Но это разве библиотека? Это вроде больше к примерам подходит. И мне кажется оно больше относится к категории взаимодействие с процессам чем с окнамии, или просто «Интеракция» :smile:.

P.S
Я немного подправил «Правила обязательного оформления публикаций», мне кажется нет причины дублировать название и в шапке темы, оно есть в заголовке.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR сказал(а):
Но это разве библиотека? Это вроде больше к примерам подходит.

А что же это еще? См. Messages.au3 в прикрепленных файлах. А пример он сам по себе.

:-\
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
А что же это еще? См. Messages.au3 в прикрепленных файлах
Я видел это, ещё раньше где то :smile:
Просто может мы неправильно определяем понятие библиотека/library... хотя раз уж UDF, то подразумивается любая пользователская функция...
 

CreatoR

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я полагаю одна и более пользовательских функций, сгрупированных тематически и реализованных в отдельном файле. Или же: совокупность функций, организованных в отдельном модуле и предназначенных для реализации и поддержки общих задач.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Последний ответ перенес в раздел О форуме.
 

LapaM

Новичок
Сообщения
7
Репутация
4
[Ошибки] Re: Коммуникация между процессами

Подскажите пожалуйста, почему возникает такая ошибка:

*\Messages.au3(163,60) : ERROR: Opt() called with illegal argument 1: "OnExitFunc"
Global $OnMessagesExit = Opt('OnExitFunc', "OnMessagesExit")

Заранее благодарю
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: [Ошибки] Re: Коммуникация между процессами

LapaM сказал(а):
Подскажите пожалуйста, почему возникает такая ошибка...

Потому что в новых версиях AutoIt нужно использовать

Код:
OnAutoItExitRegister('OnMessagesExit')


вместо

Код:
Global $OnMessagesExit = Opt('OnExitFunc', 'OnMessagesExit')


а в функции OnMessagesExit() удалить следующую строку

Код:
Call($OnMessagesExit)


Я прекратил работу над этой UDF, ты можешь сам внести эти исправления для совместимости с новыми версиями AutoIt.
 
Верх