Что нового

[Процессы] Узнать наличие дочернего процесса и его 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,322
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,322
Sedrick,
Если процесс сам себя перезапускает, то отследить его новый PID не проблема. Меня смущает фраза
Процессов с таким именем может быть несколько
Их количество меняется? Путь к исполняемым файлам этих процессов один и тот же или разный?
 
Автор
Sedrick

Sedrick

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