Что нового

[Процессы] Как мониторить состояние скрипта другим скриптом?

ak40u

Знающий
Сообщения
33
Репутация
7
Не могу решить задачу.
Есть скрипт который висит в памяти и периодически выполняет определенные действия. Допустим это:

Код:
while 1
sleep (5000)
$var = msgbox(0,"","я скрипт 1")
wend


Мне нужно чтобы параллельно с ним в памяти висел другой скрипт, который будет следить за состоянием первого скрипта, соответственно свое состояние первый скрипт должен уметь передавать второму, а тот обрабатывать. В нашем случае надо передать скрипту 2, значение переменной $var, а тот должен вывести окно сообщения "$var="&$var.
Также хотелось бы чтобы 2 скрипт был родительским процессом, а 1 дочерним от 2го (после компиляции разумеется). (для того чтобы родственными процессами не засорять процесс лист, или дочерний не скроется в основном?)
Помогите пожалуйста.
 

Sp01LeR

Знающий
Сообщения
45
Репутация
12
Наверно самым легким способом общения в этом случае (передача параметра только в одну сторону) будет использование функций ConsoleWrite() и StdoutRead() с запуском через Run() с параметром $STDOUT_CHILD
 

beve

Осваивающий
Сообщения
104
Репутация
31
Так можно сделать:
Код:
#Include <GUIConstantsEx.au3>

Opt('WinTitleMatchMode', 3)

global const $TITLE_SENDER = '#Sender'
global const $TITLE_RECEIVER = '#Reseiver'
global const $WM_COPYDATA = 0x004A

global $sMsg, $Flag = 0

if WinExists($TITLE_RECEIVER) then
    if WinExists($TITLE_SENDER) then
        exit
    endif
    _Sender() 
else
    _Receiver()
endif

func _Sender()
	OnAutoItExitRegister("_Exit")
	#NoTrayIcon
	TraySetState()
	TraySetToolTip("Sender")
	TraySetIcon("Shell32.dll", 1)
	GUICreate($TITLE_SENDER)
	GUIRegisterMsg($WM_COPYDATA, '_WM_COPYDATA')
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Local $iCount=0
	while 1
		sleep (3000)
		$iCount+=1
		$hWnd = WinGetHandle($TITLE_RECEIVER)
		if (not @error)  then	 _SendData($hWnd, "$var="&$iCount)
	wend
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
endfunc ;_Sender()
;
;
func _Receiver()
	#NoTrayIcon
	TraySetState()
	TraySetToolTip("Receiver")
	TraySetIcon("Shell32.dll", 2)
	GUICreate($TITLE_RECEIVER)
	GUIRegisterMsg($WM_COPYDATA, '_WM_COPYDATA')

	while 1
		Sleep(10)
		if $Flag then
			if $sMsg = '@exit' then exit
			$Flag = 0
			_Message($sMsg)
		endif
	wend
endfunc; _Receiver

func _Exit()
	_SendData(WinGetHandle($TITLE_RECEIVER), '@exit')
endfunc

func _Message($sData)
    MsgBox(0, 'Message', $sData, 1)
endfunc; _Message()

func _SendData($hWnd, $sData)
    local $tCOPYDATA, $tMsg

    $tMsg = DllStructCreate('char[' & StringLen($sData) + 1 & ']')
    DllStructSetData($tMsg, 1, $sData)
    $tCOPYDATA = DllStructCreate('dword;dword;ptr')
    DllStructSetData($tCOPYDATA, 2, StringLen($sData) + 1)
    DllStructSetData($tCOPYDATA, 3, DllStructGetPtr($tMsg))
    $Ret = DllCall('user32.dll', 'lparam', 'SendMessage', 'hwnd', $hWnd, 'int', $WM_COPYDATA, 'wparam', 0, 'lparam', DllStructGetPtr($tCOPYDATA))
    if (@error) or ($Ret[0] = -1) then
        return 0
    endif
    return 1
endfunc; _SendData

func _WM_COPYDATA($hWnd, $msgID, $wParam, $lParam)

    local $tCOPYDATA = DllStructCreate('dword;dword;ptr', $lParam)
    local $tMsg = DllStructCreate('char[' & DllStructGetData($tCOPYDATA, 2) & ']', DllStructGetData($tCOPYDATA, 3))

    $sMsg = DllStructGetData($tMsg, 1)
; For Receiver
    $Flag = 1

    return 0
endfunc; _WM_COPYDATA

Скомпилируй этот скрипт, и запусти 2 раза полученный екзешник чтоб увидеть как работает. Посмотри также сдесь: http://autoit-script.ru/index.php?topic=2733.0
 
Верх