Что нового

Детект зависания клиента

Devastator

Новичок
Сообщения
14
Репутация
2
Какие есть способы проверки зависания клиента EVE?
Желательно кушающие минимум времени и ресурсов?
Проверяю включая второстепенные модули(щиты и т.д.) и проверяя их активность, но это не универсально, ведь таких модулей может и не быть.
 

hikki

Продвинутый
Сообщения
233
Репутация
99
На моей памяти чтото мало зависаний клиента, в основном всетаки это дисконекты, в этом случае периодически проверяется положение и title окна, потомучто при дисконекте оно уходит в центр экрана, по умолчанию у меня включено отображение имени чара в заголовке окна и при старте бота делается
Код:
WinMove("EVE - ", "", 0, 0)

в случае дисконекта тайтл окна перестает быть "EVE - " становится "EVE" и координаты меняются с 0,0 на другие.
 

garrul

Знающий
Сообщения
16
Репутация
10
Зависаний и вправду мало, но вот лично у меня изредка бывает такой глюк в виртуалке, когда инет на большом компе кратковременно отваливается, а в виртуалке изменения статуса сети произойти не успевает. Так вот, если это происходит в момент "пассивного" рабочего процесса (время между прилётом в белт и заполнением трюма), то клиент думает, что инет есть и не дисконнектится. А бот пробегая по датчикам, считает, что идет копка - всё оке... и так оч.долго...
отлавливается это всё просто: проверяется заполненность капы - активные модули кушают электричество и капа не может быть полной. Все остальные косяки ловятся по сдвигу окна, т.к. когда клиент отправляет активные действия, то он быстро понимает, что произошёл дисконнект и перегружается.
Можно в принципе ещё расставлять таймеры предельного времени выполнения операций.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
А у меня при дисконнектах очень редко вылетает сама игра. То есть дисконнект он как бы наступил, в игре для других меня нету, а вот я сам на своем клиенте могу спокойно летать, делать вид что струлляю, включать и выключать модули, правда докаться и тд и тп не могу, просто вишу возле станции. Этакий локальный десинк. Лечится и детектируется это только путем отправки 2-3 сообщений в чат. Если и правда десинк, то отобразится лишь 1 сообщение и клиент продолжит висеть либо вылетит, либо отобразив одно сообщение продолжит радасна думать что в игре, при этом уже придется вручную перезапускать, ибо самопроизвольного рестарта не дождешься.
 
Автор
D

Devastator

Новичок
Сообщения
14
Репутация
2
2 hikki
Я веду учет окон по winHWND, так наверняка:smile:
Перезапуск клиента отслеживается нормально, а вот с зависанием проблема.

2 garrul
Таймеры хорошо работают при майнинге, но плохо при киле неписи(иногда их приходится долго догонять:smile:) и сальваге.

2 Belfigor
Вот об этой ситуации я и говорю. У меня случается редко, но иногда бывает и бот висит пока не увижу(а смотрю редко:smile:) или клиент не перемкнет и он не перезагрузится. Чат, как неплохой вариант.

П.С.
Есть еще варианты?
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Как я уже где-то писал, у меня на это отдельный скрипт-наблюдатель.
Смысл - основной скрипт бота во время проверок, при положительном результате, изменяет файлик ping.txt, просто чтоб время изменения файла поменялось. Наблюдатель же висит и каждую минуту сверяет, как давно был изменён пинг-файл. Если дольше N минут - значит в сети глюк, и тогда наблюдатель убивает процесс основного бота, убивает клиент евы, делает релогин, и запускает основной скрипт бота, ну и пинг-файл изменяет, чтоб тут же снова не убивать всё. И наблюдает дальше.
В качестве примера. При копке - пинг-файл изменяется, если при проверке заполненности трюма было замечено, что заполненность трюма увеличилась. Также, в момент дока-андока. Типа, если трюм не наполняется, мы всё не докаемся-андокаемся, и этого не происходит долго, значит висим. Таким образом, к примеру при копке льда, когда цикл составлял что-то около 6 минут, критическое время для сравнения я задавал 10-15 минут.

Как вариант для хантера - изменение пинг-файла при изменении количества залоченных целей (при зависоне непись "неубиваемая", количество целей не меняется), или уменьшение здоровья цели, если за этим ведётся наблюдение. Моменты перехода в варп, выхода из варпа. Уменьшение (после релоада) или увеличение (если лутаем) загруженности трюма, только тут надо учитывать, чтобы один релоад изменял заполненность настолько, чтобы это датчик заполненности заметил.

Так что пинг-файл изменяется как раз в моменты изменения некоторых отслеживаемых состояний корабля, которые не меняются в случае незамеченного дисконнекта.

Код:
#include <Date.au3>
;...
$fdate=FileGetTime("_ping.txt")
$raz=_DateDiff("n", $fdate[0]&"/"&$fdate[1]&"/"&$fdate[2]&" "&$fdate[3]&":"&$fdate[4]&":"&$fdate[5], _NowCalc())
 if $raz>10 ; если больше 10 минут
  then
  _LogW("РЕЛОГ in"&@HOUR&":"&@MIN&" file "&$fdate[3]&":"&$fdate[4]&" разница "&$raz)

;   вот тут убиваем, перезапускаем...
 endif


Код:
Func _Ping()
Local $file
$file = FileOpen("_ping.txt", 2)
FileWriteLine($file, @MDAY & "." & @MON & "." & @YEAR & " - " & @HOUR & ":" & @MIN & ":" &@SEC)
FileClose($file)
EndFunc; => _Ping
 
Верх