Что нового

[Процессы] Узнать наличие дочернего процесса и его pid.

Sedrick

Новичок
Сообщения
10
Репутация
0
Приложение при потери связи перезапускается. Создаёт дочерний процесс и убивает основной. Нужно узнать pid нового процесса и отличать эту ситуацию от обычного закрытия приложения. Процессов с таким именем может быть несколько.

Код:
Func WaitProcessKilled()
ProcessWaitClose($PID)
If Был создан дочерний процесс Then
	$PID=PID нового процесса.
	Function1()
	Function2()
	WaitProcessKilled()
Else
	Exit 0
EndIf
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Sedrick
Попробуйте так:
Код:
#include <WinAPIEx.au3>

Global $iPouse = 5 ;пауза в секундах между проверками

HotKeySet("{ESC}", "_MyExit") ;Esc - выход

AdlibRegister('WaitProcessKilled', $iPouse * 1000)

While 1
	Sleep(10)
WEnd


Func WaitProcessKilled()
	Local $aProcessList, $sPath, $i
	Local $sProcessParent = 'process1.exe' ;основной процесс
	Local $sProcessChild = 'process2.exe'; дочерний процесс
	Local $sPathChild = @ProgramFilesDir & '\Folder\' & $sProcessChild ;путь к файлу дочернего процесса

	If Not ProcessExists($sProcessParent) Then ;если нет основного процесса
		$aProcessList = ProcessList($sProcessChild);получаем массив дочерних процессов
		If $aProcessList[0][0] Then ;если есть дочерние процессы
			For $i = 1 To $aProcessList[0][0]
				$sPath = _WinAPI_GetModuleFileNameEx($aProcessList[$i][1]);определяем путь к дочернему процессу
				If StringInStr($sPath, '~') Then ;если функция вернула короткий путь
					$sPathChild = FileGetShortName($sPathChild) ;преоразовываем заданный путь в короткий
				EndIf
				If $sPath = $sPathChild Then ;если путь к файлу дочернего процесса совпадает с заданным
					_MyFunc1()
					ExitLoop
				EndIf
			Next
		Else ;если нет дочерних процессов
			_MyFunc2()
		EndIf
	Else ;если есть основной процесс
		_MyFunc3()
	EndIf
EndFunc   ;==>WaitProcessKilled


Func _MyFunc1()
	TrayTip('Test', 'Нет основного процесса.' & @CRLF & 'Есть дочерний процесс.', 3, 17)
EndFunc   ;==>_MyFunc1

Func _MyFunc2()
	TrayTip('Test', 'Нет основного процесса.' & @CRLF & 'Нет дочернего процесса.', 3, 17)
EndFunc   ;==>_MyFunc2

Func _MyFunc3()
	TrayTip('', '', 0)
EndFunc   ;==>_MyFunc3

Func _MyExit()
	Exit
EndFunc   ;==>_MyExit
WinAPIEx.au3
 
Автор
Sedrick

Sedrick

Новичок
Сообщения
10
Репутация
0
Имена обоих процессов одинаковые. Ведь он сам себя перезапускает используя один файл. Попробую по уже известному pid проверять.
 
Автор
Sedrick

Sedrick

Новичок
Сообщения
10
Репутация
0
Мне казалось это очевидным, ведь я уточнил, что приложение перезапускается. В любом случае ваш пример от этого не хуже.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Sedrick,
Если процесс сам себя перезапускает, то отследить его новый PID не проблема. Меня смущает фраза
Процессов с таким именем может быть несколько
Их количество меняется? Путь к исполняемым файлам этих процессов один и тот же или разный?
 
Автор
Sedrick

Sedrick

Новичок
Сообщения
10
Репутация
0
madmasles сказал(а):
Sedrick,
Если процесс сам себя перезапускает, то отследить его новый PID не проблема. Меня смущает фраза
Процессов с таким именем может быть несколько
Их количество меняется? Путь к исполняемым файлам этих процессов один и тот же или разный?
Это мморпг. Пользователь запускает файл eve.exe, который запускает ExeFile.exe и сам убивается. В случае логофа или потери связи клиент перезапускается — создаётся одноимённый (ExeFile.exe) дочерний процесс, основной убивается. У меня может быть запущено два-три клиента. Каждый клиент имеет свою папку, но созданную посредством NTFS junction point, хотя при необходимости сделать физическую копию не проблема.
 
Верх