Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как узнать запущены ли два процесса с одним именем

Ответить
Настройки темы
[решено] Как узнать запущены ли два процесса с одним именем

Аватара для CyberStyLe

Новый участник


Сообщения: 44
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 13:12, 15-10-2009

 

Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
ProcessList('processname')

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Отправлено: 13:37, 15-10-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для CyberStyLe

Новый участник


Сообщения: 44
Благодарности: 4

Профиль | Отправить PM | Цитировать


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)
и дальше код...

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

Отправлено: 13:50, 15-10-2009 | #3


Аватара для kaster

Старожил


Сообщения: 367
Благодарности: 91

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
some code
Необязательно создавать файл, писать туда данные а потом снова считывать. Достаточно просто проверить кол-во элементов $list[0][0]
Если больше двух, выход.
Код: Выделить весь код
$list = ProcessList("приложение.exe")
If $list[0][0] >= 2 Then
   Exit; или ProcessClose('приложение') если прога запускается извне
Else
   Run('1234.exe')
EndIf
...
Entire code
...

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Отправлено: 13:56, 15-10-2009 | #4


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


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

Код: Выделить весь код
$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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:50, 15-10-2009 | #5


Аватара для CyberStyLe

Новый участник


Сообщения: 44
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 06:31, 16-10-2009 | #6


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 17:46, 16-10-2009 | #7


Аватара для CyberStyLe

Новый участник


Сообщения: 44
Благодарности: 4

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:14, 18-10-2009 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как узнать запущены ли два процесса с одним именем

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Как одним кликом открыть два всплывающих окна QUMATOZ Вебмастеру 15 11-05-2010 19:16
CMD/BAT - [решено] Удаление всех папок с одним именем на всех дисках volk1234 Скриптовые языки администрирования Windows 15 13-11-2009 02:13
VBA - Как узнать имя процесса-родителя akkorn Программирование и базы данных 4 16-03-2009 11:33
Как узнать имя процесса по смещению Andre505 Microsoft Windows 95/98/Me (архив) 3 28-09-2003 00:29
Как узнать имя процесса по смещению Andre505 Программирование и базы данных 2 27-09-2003 13:55




 
Переход