Что нового

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

VadimKHL

Новичок
Сообщения
159
Репутация
0
Всех приветствую.
Подскажите, можно ли как то передавать данные между двумя скриптами, мелкие, в виде флагов, без записи в файл?
Допустим первое приложение работает с ком портом, которое должно передать сообщение другому приложению, если вдруг оно потеряла связь с портом.
Может можно как то через Dummy это реализовать или события OnEvent?
Подскажите пожалуйста.
 

Prog

Продвинутый
Сообщения
607
Репутация
77
Можно организовать связь через клиент - сервер или отправлять сообщения окну.
 

All2khoff

Продвинутый
Сообщения
393
Репутация
72
Два скрипта, не проверялось на реальном компорте.... материнский запускает дочку и уточняет какой порт читать,
а дочка проверяет доступность порта, после чего передаёт информацию маме.

Код:
;mather.au3
; Указываем COM-порт для проверки
Local $comPort = "COM-1" ; Измените на нужный вам COM-порт

; Запускаем дочерний скрипт и передаем номер COM-порта
Local $processID = Run('AutoIt3.exe "chield.au3" "' & $comPort & '"', "", @SW_HIDE, 1)


; Ждем завершения дочернего процесса и получаем вывод
Local $output = StdoutRead($processID)

; Убираем пробелы с обеих сторон
$output = StringStripWS($output, 1)

; Выводим результат в консоль
ConsoleWrite("Полученный результат: " & $output & @CRLF)

; Проверяем результат с использованием Select Case
Select
    Case $output = TRUE
        ConsoleWrite("COM-порт " & $comPort & " доступен."& @CRLF)
    Case $output = FALSE
        ConsoleWrite("COM-порт " & $comPort & " недоступен."& @CRLF)
    Case Else
        ConsoleWrite("Неизвестный результат: " & $output& @CRLF)
EndSelect


Код:
;chield.au3
; Получаем номер COM-порта из аргументов командной строки
Local $comPort = $CmdLine[1]

; Проверяем, был ли передан номер COM-порта
If Not StringLen($comPort) Then
    ConsoleWrite("Ошибка: Не указан COM-порт." & @CRLF)
    Exit
EndIf

; Выводим номер порта для отладки
;~ ConsoleWrite("Проверка порта: " & $comPort & @CRLF)

; Открываем COM-порт для чтения
Local $hComPort = FileOpen($comPort, 0)

; Проверяем, удалось ли открыть порт
If $hComPort = -1 Then
    ; Порт недоступен
;~     ConsoleWrite("FALSE" & @CRLF)
Else
    ; Порт доступен
;~     ConsoleWrite("TRUE" & @CRLF)
    FileClose($hComPort) ; Закрываем порт
EndIf
 
Автор
V

VadimKHL

Новичок
Сообщения
159
Репутация
0
Всем спасибо. Понравился вариант с использованием Semaphore:
Код:
#Include <WinAPIEx.au3>

; Создать, если не существует или получить идентификатор семафора.
Local $iInitial = 1 ; Изначальное состояние счетчика семафора.
Local $iMaximum = 1 ; Максимальное значение счетчика.
$hSemaphore = _WinAPI_CreateSemaphore("MySemaphore", $iInitial, $iMaximum)

; Взятие семафора (декремент счетчика семафора), бесконечное ожидание.
_WinAPI_WaitForSingleObject($hSemaphore)

; Семафор получен.
MsgBox(0, "Semaphore", "Semaphore create and taken!")

; Освободить семафор (инкремент счетчика семафора).
_WinAPI_ReleaseSemaphore($hSemaphore)

; Семафор освобожден.
MsgBox(0, "Semaphore", "Semaphore free!")

; Закрыть идентификатор семафора.
_WinAPI_CloseHandle($hSemaphore)

Exit


Код:
#Include <WinAPIEx.au3>

; Открыть семафор.
Local $hSemaphore = _WinAPI_OpenSemaphore("MySemaphore")
If Not $hSemaphore Then
    ConsoleWrite(@CRLF & "Semaphore not exist!" & @CRLF)
    Exit
Else
    ; Взятие семафора (декремент счетчика семафора), если свободный, без ожидания.
    If Not _WinAPI_WaitForSingleObject($hSemaphore, 0) Then
        ConsoleWrite(@CRLF & "Semaphore FREE!" & @CRLF)
        ; Освободить семафор (инкремент счетчика семафора).
        _WinAPI_ReleaseSemaphore($hSemaphore)
    Else
        ConsoleWrite(@CRLF & "Semaphore BUSY!" & @CRLF)
    EndIf
EndIf
; Закрыть идентификатор семафора.
_WinAPI_CloseHandle($hSemaphore)
Exit
 
Верх