Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Как узнать запущены ли два процесса с одним именем (http://forum.oszone.net/showthread.php?t=153271)

CyberStyLe 15-10-2009 13:12 1243643

Как узнать запущены ли два процесса с одним именем
 
Необходимо знать запущены ли два процесса с одним именем или нет. Процессы из одного приложения. У кого какие мысли на этот счет?

kaster 15-10-2009 13:37 1243665

Код:

ProcessList('processname')

CyberStyLe 15-10-2009 13:50 1243671

kaster, Нет, ты меня немного недопонял. Есть приложение создающие из себя два процесса. Необходимо реализовать следующую проверку: если запущен один процесс или ни одного, то гууд. Если два то выход.

По сути я это уже реализовал, но только деревянным методом:

$list = ProcessList("приложение.exe")

for $i = 1 to $list[0][0]
FileWriteLine("test.txt", $list[$i][1])
next

Sleep(50)

$datacheckline = _FileCountLines("test.txt")

if $datacheckline >= 2 Then
exit
Elseif $datacheckline = 1 Or NOT FileExists("test.txt") Then
Run(1234.exe)
и дальше код...

Он слишком прост, и тем более создается левый файл. Нужно как-то попрофессиональней чтоли ;)

kaster 15-10-2009 13:56 1243675

Да нет, я все правильно понял :)
Но твой способ действительно "деревянный" :teeth:
И потом, обрамляй код тэгами

Код:

some code
Необязательно создавать файл, писать туда данные а потом снова считывать. Достаточно просто проверить кол-во элементов $list[0][0]
Если больше двух, выход.
Код:

$list = ProcessList("приложение.exe")
If $list[0][0] >= 2 Then
  Exit; или ProcessClose('приложение') если прога запускается извне
Else
  Run('1234.exe')
EndIf
...
Entire code
...


Creat0R 15-10-2009 14:50 1243734

Если нужно узнать является ли второй процесс дочерним первому, то сделать это можно так:

Код:

$aChilds_IDs = _ProcessGetChildren("приложение.exe")

If Not @error And $aChilds_IDs[0][0] >= 1 Then
    Exit 2
Else
    Run("1234.exe")
EndIf

;===================================================================================================
; Function Name:    _ProcessGetChildren()
;
; Description:      Retrieve an array of all top level child processes
;
; Parameter(s):    $i_pid: The process identifier of the process you want to list the child
;                      processes from
;
; Return Value(s):
;                On Success:
;                  2 dimensional array:
;                  [0][0] number of child processes found
;                  [n][0] is the process id of the child
;                  [n][1] is the process name of the child
;
;                On Failure:
;                  Non array
;
;                @Error:
;                  (1): CreateToolhelp32Snapshot failed
;                  (2): Process32First failed
;                  (3): No children processes found
;
; Remark(s):        Tested on Windows XP SP2
;
; Author(s):        SmOke_N (Ron Nielsen)
;
;===================================================================================================

Func _ProcessGetChildren($i_Pid) ; First level children processes only
    If IsString($i_Pid) Then $i_Pid = ProcessExists($i_Pid)
    If Not $i_Pid Then Return SetError(-1, 0, $i_Pid)

    Local Const $TH32CS_SNAPPROCESS = 0x00000002

    Local $a_tool_help = DllCall("Kernel32.dll", "long", "CreateToolhelp32Snapshot", "int", $TH32CS_SNAPPROCESS, "int", 0)
    If IsArray($a_tool_help) = 0 Or $a_tool_help[0] = -1 Then Return SetError(1, 0, $i_Pid)

    Local $tagPROCESSENTRY32 = _
            DllStructCreate( _
            "dword dwsize;" & _
            "dword cntUsage;" & _
            "dword th32ProcessID;" & _
            "uint th32DefaultHeapID;" & _
            "dword th32ModuleID;" & _
            "dword cntThreads;" & _
            "dword th32ParentProcessID;" & _
            "long pcPriClassBase;" & _
            "dword dwFlags;" & _
            "char szExeFile[260]")

    DllStructSetData($tagPROCESSENTRY32, 1, DllStructGetSize($tagPROCESSENTRY32))

    Local $p_PROCESSENTRY32 = DllStructGetPtr($tagPROCESSENTRY32)
    Local $a_pfirst = DllCall("Kernel32.dll", "int", "Process32First", "long", $a_tool_help[0], "ptr", $p_PROCESSENTRY32)
    If IsArray($a_pfirst) = 0 Then Return SetError(2, 0, $i_Pid)

    Local $a_pnext, $a_children[11][2] = [[10]], $i_child_pid, $i_parent_pid, $i_add = 0
    $i_child_pid = DllStructGetData($tagPROCESSENTRY32, "th32ProcessID")

    If $i_child_pid <> $i_Pid Then
        $i_parent_pid = DllStructGetData($tagPROCESSENTRY32, "th32ParentProcessID")

        If $i_parent_pid = $i_Pid Then
            $i_add += 1
            $a_children[$i_add][0] = $i_child_pid
            $a_children
[$i_add][1] = DllStructGetData($tagPROCESSENTRY32, "szExeFile")
        EndIf
    EndIf

    While 1
        $a_pnext = DllCall("Kernel32.dll", "int", "Process32Next", "long", $a_tool_help[0], "ptr", $p_PROCESSENTRY32)
        If IsArray($a_pnext) And $a_pnext[0] = 0 Then ExitLoop

        $i_child_pid = DllStructGetData($tagPROCESSENTRY32, "th32ProcessID")

        If $i_child_pid <> $i_Pid Then
            $i_parent_pid = DllStructGetData($tagPROCESSENTRY32, "th32ParentProcessID")

            If $i_parent_pid = $i_Pid Then
                If $i_add = $a_children[0][0] Then
                    ReDim $a_children[$a_children[0][0] + 11][2]
                    $a_children[0][0] = $a_children[0][0] + 10
                EndIf

                $i_add += 1
                $a_children[$i_add][0] = $i_child_pid
                $a_children[$i_add][1] = DllStructGetData($tagPROCESSENTRY32, "szExeFile")
            EndIf
        EndIf
    WEnd

    If $i_add <> 0 Then
        ReDim $a_children[$i_add + 1][2]
        $a_children[0][0] = $i_add
    EndIf

    DllCall("Kernel32.dll", "int", "CloseHandle", "long", $a_tool_help[0])

    If $i_add Then Return $a_children
    Return SetError(3, 0, 0)
EndFunc  ;==>_ProcessGetChildren


CyberStyLe 16-10-2009 06:31 1244307

kaster, Спасибо подошло ;)

Creat0R, хотя узнавать является ли процесс дочерним было не нужно, но все равно большое спасибо. Думаю в будущем это пригодиться :)

Creat0R 16-10-2009 17:46 1244736

CyberStyLe, если тема решена, то её следует помечать как таковую: Как сообщить о том, что моя проблема решена?

CyberStyLe 18-10-2009 10:14 1245893

Creat0R, Упс.. забыл сразу сделать. Отметил как [решено] :)


Время: 23:17.

Время: 23:17.
© OSzone.net 2001-