Перейти к содержимому
  • 0
Aex

Странное поведение переменной.

Вопрос

Не знаю, где лучше расположить эту тему.

 

Ситуация:

Есть дом на сервере EvilCraft. В нём работает в режиме non-stop примерно 5 компьютеров (включая один сервер и одного робота).

В доме есть дверь. На которой запущена программа входного замка.

Программа (урезанная до скелета, чисто для демонстрации. В приведённой версии эффект наблюдается вполне) приведена тут:

https://pastebin.com/yzf4eRZq

 

Проблема:

Когда я выхожу с сервера, телепортируюсь в другой мир, или же просто покидаю чанк, то (не всегда!) проявляется следующий эффект:

Одна из переменных (в приведённом тексте TimeOut. Я пробовал её переименовать) перестаёт принимать значения.

То есть, для примера, когда я возвращаюсь в чанк и нажимаю на кнопку открытия дверей, вызывается функция VisitRequest, которая вызывает в свою очередь после проверки вызывает функцию OpenDoor, которая успешно отрабатывает, и вызывает в свою очередь функцию WaitMenu.

function WaitMenu(delay)
	sMode = -1;
	TimeOut = delay;
	timestamp = computer.uptime();
	gpu.fill(1,7, resX, resY, " ");
	gpu.set(8, 9, "PLEASE WAIT");
end

Которая выполняет всё успешно (судя по надписи на экране). Но переменная TimeOut не принимает значение delay, и остаётся в нуле (её значение по-умолчанию), судя по выводу на экран и дальнейшему поведению программы.

Обнуление переменной исключается, так как единственное место где она обнуляется не исполняется (меню не отрисовывается).

 

Может кто-то с таким сталкивался? Из-за чего такое возможно?

 

Update: Это наблюдается на как минимум двух компьютерах с двумя разными программами...

Изменено пользователем Aex

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0

Тут какое-то сильное колдунство.

В 1.7.10 чанки дюпают это всем понятно, но в данном случае программа должна выполняться дальше, даже после сотни дюпов. Я немного не понял, как будет вести себя computer.uptime() после отката чанка, вроде-бы оно привязано к времени всего мира. Но в любом случае, назад оно не пойдет.

Надо повесить хук и при очередном таком баге отловить значения computer.uptime() и timestamp в основном цикле до проверки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
21 час назад, Aex сказал:

Есть дом на сервере EvilCraft.

Возможно, речь идёт о нашем сервере EvilWorld. Если нет, то имеет смысл уточнить версию Minecraft и OpenComputers.

21 час назад, Aex сказал:

Но переменная TimeOut не принимает значение delay, и остаётся в нуле (её значение по-умолчанию), судя по выводу на экран и дальнейшему поведению программы.

По тому выводу на экран, что есть в программе, можно говорить лишь о значении переменной TimeOut в этом конкретном месте. И точно невозможно сказать, отличалось ли значение от нуля, например, перед этим участком:

if (computer.uptime() - timestamp > TimeOut) and (TimeOut > 0) then
  ...
  ShowMenu();

А здесь переменная как раз и могла обнулиться.

21 час назад, Aex сказал:

Обнуление переменной исключается, так как единственное место где она обнуляется не исполняется (меню не отрисовывается).

И почему исключается? Каким образом это проверяется? На отрисовку меню могли влиять ошибки в реализации GUI. Предлагаю на время отладки полностью отказаться от GUI и весь вывод переписать на print, или сигналить звуком, например, так:

if TimeOut > 0 then
  computer.beep()
end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Есть одна идея, хотя и вряд ли поможет. Если TimeOut обнуляется, то может сам delay равен нулю? Попробуй проверить, вдруг поможет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
16.02.2019 в 21:25, Aex сказал:

меню не отрисовывается

Предположение:

При перезапуске сервера аптайм компьютера обнуляется, а переменная timestamp остается неизменной.

Таким образом после перезапуска

(computer.uptime() - timestamp > TimeOut) and (TimeOut > 0)

всегда будет ложным и ShowMenu() на с167 строке не выполнится.

 

Проверка: нужно проверять не ушло ли значение uptime назад.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
1 минуту назад, man_cubus сказал:

При перезапуске сервера аптайм компьютера обнуляется

В какой версии так происходит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
Только что, eu_tomat сказал:

В какой версии так происходит?

Я ж написал что это предположение, гипотеза. Написал как её проверить. Причём тут номер версии чего бы то ни было?

 

Например вот тут есть неявное предположение о том, что в секунде 20 игровых тиков.

Для нагруженного сервера это не совсем верно и при старте может вызвать как минимум отставание аптайма. А если еще и entityPlayer.getEntityWorld.getTotalWorldTime обнуляется для сервера целиком, то аптайм уйдёт далеко назад от последнего таймстампа.

 

Еще раз: я этого не знаю, это только предположение которое можно проверить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
28.03.2019 в 12:51, man_cubus сказал:

аптайм уйдёт далеко назад от последнего таймстампа

У меня робот на мобоферме в Evil работает больше 11 часов непрерывного времени, программа показывает время от начала запуска.

Робот был поставлен несколько месяцев назад и пережил много перезагрузок сервера и много загрузок и выгрузок рабочего чанка.

Время в обратную сторону никогда не шло.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...