1

Тема: AHK: Не закрывает процесс

Привожу часть кода из огромного скрипта.
Почему-то процесс WerFault.exe не закрылся.
Когда же запустил эту часть кода отдельно, то закрылся.
Что может быть причиной?


oIE.Quit
WinClose ahk_id %oIEHWND%
ErrorLevel := 1
While ErrorLevel
   Process, Close, WerFault.exe

2

Re: AHK: Не закрывает процесс

Привожу часть кода из огромного скрипта.

Возможно контекст не полный.

Маловероятно, но могу предложить замену:

ErrorLevel := 1
While ErrorLevel
   Process, Close, WerFault.exe

на:

Loop 
   Process, Close, WerFault.exe
   Until ErrorLevel

возможно что то меняет ErrorLevel.

И вопрос, зачем в большом коде,

While ErrorLevel
   Process, Close, WerFault.exe

если процесс закрыт, продолжать цикл?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3 (изменено: Malcev, 2014-12-17 23:37:45)

Re: AHK: Не закрывает процесс

Возможно, что-то меняет ErrorLevel, но так как процесс WerFault.exe был один, то получается, что поменяло сразу.
Может быть AHK не смог его закрыть - тогда тоже ErrorLevel возвращает 0.

зачем в большом коде,
если процесс закрыт, продолжать цикл?

На случай если процессов несколько.
Возможно ли такое, что в этом коде msgbox не выскочит?

ComObjError(false)
oIE := ComObjCreate("InternetExplorer.Application") 
oIE.visible := True, oIEHWND := oIE.HWND 
WinMaximize ahk_id %oIEHWND%
oIE.Quit
WinClose ahk_id %oIEHWND%
ErrorLevel := 1
While ErrorLevel
   msgbox

4

Re: AHK: Не закрывает процесс

В этом, нет.

На случай если процессов несколько.

While ErrorLevel
   Process, Close, WerFault.exe

Тут если процесс не закрыт с первого раза, то выход из цикла. Надо бы в нём добавить проверку существования процесса.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5 (изменено: Malcev, 2014-12-18 00:09:38)

Re: AHK: Не закрывает процесс

А какое число попыток целесообразно ставить?

While ErrorLevel and A_Index < 10
{
   Process, Close, WerFault.exe
   Process, Exist, WerFault.exe
}

6

Re: AHK: Не закрывает процесс

Не думаю, что есть однозначный ответ на такой вопрос.

Я бы сюда добавил некую паузу после Close, или Exist заменил на WaitClose.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: Не закрывает процесс

А некая пауза это сколько?
sleep, 1000 нормально?

8

Re: AHK: Не закрывает процесс

Вопрос такой же как и предыдущий, как будет удобно. Например 200мс.
Но лучше WaitClose, чтобы не ждать окончания пауз при успешных завершениях процесса.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Не закрывает процесс

Не могу понять. Почему-то код не закрывает один процесс WerFault.exe в комплексном скрипте.
Если же его запустить отдельно, то все хорошо.
В чем таки может быть ошибка?

oIE.Quit
WinClose ahk_id %oIEHWND%
ErrorLevel := 1
While ErrorLevel and A_Index < 10
{
   Process, Close, WerFault.exe
   Process, WaitClose, WerFault.exe, 1
}

10

Re: AHK: Не закрывает процесс

Malcev пишет:

Почему-то код не закрывает один процесс WerFault.exe в комплексном скрипте.

А сколько процессов WerFault.exe было?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Не закрывает процесс

Один.

12

Re: AHK: Не закрывает процесс

Нужно проверить, срабатывает ли вообще цикл:

ErrorLevel := 1
While ErrorLevel and A_Index < 10
{
   Process, Close, WerFault.exe
   Process, WaitClose, WerFault.exe, 1
   MsgBox, % ErrorLevel
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Не закрывает процесс

Поставил на проверку. Правда когда выскочит ошибка - неизвестно.
А может ли быть это из-за того, что процесс называется Werfault.exe *32?

14

Re: AHK: Не закрывает процесс

Нет, *32 — это не часть имени процесса, это просто метка.
Вообще-то, сам подход не совсем верный. Если процесс один, правильнее так:

Process, Close, WerFault.exe
Loop
   Process, WaitClose, WerFault.exe, 1
until !ErrorLevel || A_Index = 10
if ErrorLevel
   MsgBox, Не удалось завершить процесс WerFault.exe за 10 секунд

Если несколько, так:

oProcesses := []
for process in ComObjGet("winmgmts:").InstancesOf("Win32_Process where Name='WerFault.exe'")
   oProcesses[A_Index] := process.ProcessId

for k, PID in oProcesses
{
   Process, Close, %PID%
   Loop
      Process, WaitClose, %PID%, 1
   until !ErrorLevel || A_Index = 10
   if ErrorLevel
      MsgBox, Не удалось завершить процесс %PID% за 10 секунд
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15 (изменено: Malcev, 2015-01-08 15:07:07)

Re: AHK: Не закрывает процесс

А я не знаю сколько их может быть.
И разве из-за несовсем неправильного подхода может код не срабатывать?
Этот подход правильный?

process := "notepad.exe"
n := prev := ErrorLevel := ""
Loop
{
   Process, Close, %process%
   Process, Exist, %process%
   if !ErrorLevel
      break
   if n = 100
      MsgBox, Не удалось завершить процесс %process% за 10 секунд
   sleep 100
   n++
   if (prev != ErrorLevel)
   {
      prev := ErrorLevel
      n := ""
   }
}

16

Re: AHK: Не закрывает процесс

Не думаю, что так лучше.

   Process, Close, %process%
   Process, Exist, %process%
   if !ErrorLevel
      break

Вполне может оказаться, что в первой строчке код обращается к одному процессу, а во второй уже к другому, поэтому Errorlevel ни о чём не говорит.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Не закрывает процесс

Так и пускай обращается - нам же надо закрыть все процессы notepad.exe.
А таймер 10 секунд обнуляется в этой строчке:

   if (prev != ErrorLevel)
   {
      prev := ErrorLevel
      n := ""
   }

18

Re: AHK: Не закрывает процесс

Этот подход правильный?

Если несколько, то нет. Надо обращатся к идентификатору процесса, а не к его имени.

А таймер 10 секунд обнуляется в этой строчке:

   Process, Close, %process%
   Process, Exist, %process%
   if !ErrorLevel
      break

Если процесс не закрывается, то у тебя тут вечный цикл, и сюда:

   if (prev != ErrorLevel)
   {
      prev := ErrorLevel
      n := ""
   }

выполнение не дойдёт.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Не закрывает процесс

Ну, не знаю, мне мой вариант кажется более последовательным. Если процессов с одним именем много, логично к ним обращаться по PID. Если процесс не закрылся после однократного Process, close, не имеет смысла бомбить его этой командой далее.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20

Re: AHK: Не закрывает процесс

Если процесс не закрывается, то у тебя тут вечный цикл, и сюда:

   if (prev != ErrorLevel)
   {
      prev := ErrorLevel
      n := ""
   }

выполнение не дойдёт.

Как это не дойдет?
Они же в одном цикле находятся.

21

Re: AHK: Не закрывает процесс

Они же в одном цикле находятся.

Мда, это я Break с Continue подсознательно попутал :LOL:. Праздники.

Думаю такой вариант проще:

process := "notepad.exe" 

Loop 10
    run %process%

Loop
{
   Process, Exist, %process%
   Process, Close, % Pid := ErrorLevel
   Process, WaitClose, %PID%, 10 
   If ErrorLevel 
        MsgBox, Не удалось завершить процесс: %process%, пид: %PID% за 10 секунд 
} Until !Pid

MsgBox, Все процессы: %process% завершены.
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: Не закрывает процесс

teadrinker пишет:

Если процесс не закрылся после однократного Process, close, не имеет смысла бомбить его этой командой далее.

Если действительно нет смысла, то я бы так написал:


process := "notepad.exe" 

Loop 10
    run %process%
    
For Proc In ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process where Name='" process "'")
{ 
    Process, Close, % Pid := Proc.ProcessId
    Process, WaitClose, %Pid%, 10 
    If ErrorLevel 
        MsgBox, Не удалось завершить процесс: %process%, пид: %Pid% за 10 секунд 
}
MsgBox, Все процессы: %process% завершены.

Непонятен фрагмент:

   Loop
      Process, WaitClose, %PID%, 1
   until !ErrorLevel || A_Index = 10
   if ErrorLevel

есть отличия от:

    Process, WaitClose, %Pid%, 10 
    If ErrorLevel 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

23

Re: AHK: Не закрывает процесс

serzh82saratov пишет:

Непонятен фрагмент:

Согласен, это я не подумав из предыдущего варианта скопировал. Ещё логичнее так:

MyPpoc := "notepad.exe"
Loop 10
   Run, % MyPpoc

oProcesses := []
for process in ComObjGet("winmgmts:").InstancesOf("Win32_Process where Name='" . MyPpoc . "'")
   oProcesses[A_Index] := process.ProcessId, process.Terminate

for k, PID in oProcesses
   Process, WaitClose, %PID%, 10
until ErrorLevel && NotAllClosed := 1

if NotAllClosed
{
   for k, PID in oProcesses
   {
      Process, Exist, %PID%
      if ErrorLevel
         NotClosed .= (A_Index = 1 ? "" : ", ") . PID
   }
   MsgBox, Не удалось завершить процессы %NotClosed%
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24

Re: AHK: Не закрывает процесс

А если процесс не закрылся с первого раза, то действительно долбать его не имеет смысла?

25

Re: AHK: Не закрывает процесс

Просто не вижу причины, почему процесс должен закрыться после второй попытки, если не закрылся после первой.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26

Re: AHK: Не закрывает процесс

Ну например в текущий момент он не может быть завершен из-за драйвера например видеокарты, а через какое-то время драйвер дает добро на завершение.
Так вот интересно, нужно ли опять его завершать или достаточно просто подождать  Process, WaitClose?

27

Re: AHK: Не закрывает процесс

Не уверен конечно на сто процентов, но, по-моему метод Terminate (как и команда Process, Close) убивает процесс без всяких условий, если есть права доступа и не зависла система. Можешь поэкспериментировать на всякий случай.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

28

Re: AHK: Не закрывает процесс

Сегодня выдало ошибку - 0x80041002.
http://support.microsoft.com/kb/2465990/ru