Что нового

[Процессы] Определить зависание процесса explorer.exe(рабочий стол)

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
При вызове контекстного меню файла происходит зависание Windows. вызывается только диспетчер задач..через него тушу explorer.exe и так же запускаю через секунд 10..после этого зависания исчезают..хотелось бы автоматизировать эти действия. но как отловить момент зависания?
конечно, надо лечить эту болячку, но пока не получается, а переустановка слишком хлопотное дело. комп рабочий..куча принтеров на нем висит и т.п.
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Ты правильно понимаешь - более правильно лечить данную проблему. Начинать стоит с анализа того что делалось на ПК перед возникновением проблемы (например какие приложения устанавливал, ставились ли обновления системы или системных компонентов), возможно попробовать удалить последние установленные программы, смотреть логи, проверить ПК на наличие вирусов, также в большинстве случаев помогает ПУСК-все программы-стандартные-служебные-восстановление системы (выбрать дату когда все кул было). начинать рекомендую с восстановления... Также рекомендую ознакомится с командой sfc /scannow. Восстановить нормальную работу системы можно в 99.9% случаев. Было бы больше инфы можно было бы давать конкретные советы...
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
я системный администратор нашей конторы плюс к этому возня с компами мое самое сильное увлечение ( ну после женщин, конечно)..глюк произошел после чистки реестра..делал это мой сотрудник программой... я конечно найду лечение для системы. но интересно узнать реализацию через автоит - как отловить то время, когда происходит зависание .
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Александр,
А в момент зависания explorer.exe увеличивает потребление памяти / загрузки процессора?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Где-то видел, как кто-то определял зависание через посыл сообщений окну.
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
потребление памяти в норме..просто тупо висит..и именно при вызове контекстного меню. проги стоят обычные..дома на компе такие же
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Как то так примерно:
Код:
If _ProcessIsHang(Controlgethandle('[class:Shell_TrayWnd]','','')) then Processclose('explorer.exe')
Func _ProcessIsHang($hWnd)
$aResult = DllCall("user32.dll", "int", "SendMessageTimeout", _
        "hwnd", $hWnd, "int", 0, "ptr", 0, "ptr", 0, "uint", 3, "uint", 3000, "ptr", 0);3 секунды ждем ответа от программы
	If Not IsArray($aResult) then Return
	if $aResult[0]=0 then
		ConsoleWrite(' Висит' & @LF)
              Return 1
	Else
		ConsoleWrite(' Не висит' & @LF)
              Return 0
	EndIf
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
r35p3ct,
_WinAPI_SendMessageTimeout() из WinAPIEx.au3. :smile:
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
madmasles
Буду знать)
Изначально было взято ОТСЮДА давным давно, так и использую)
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
использовал предложенную функцию так
Код:
While 1
	_ProcessIsHang(ControlGetHandle('[class:Shell_TrayWnd]', '', ''))
	Sleep(500)
WEnd
Func _ProcessIsHang($hWnd)
	$aResult = DllCall("user32.dll", "int", "SendMessageTimeout","hwnd", $hWnd, "int", 0, "ptr", 0, "ptr", 0, "uint", 3, "uint", 5000, "ptr", 0);5 секунды ждем ответа от программы
	If Not IsArray($aResult) Then Return
	If $aResult[0] = 0 Then
		ProcessClose('explorer.exe')
		Sleep(3000)
		ShellExecute("C:\WINDOWS\explorer.exe")
	EndIf
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
_WinAPI_IsHungAppWindow(_WinAPI_GetShellWindow())
 
Верх