Игнорирование OnApplicationStart
-
Случайно обнаружил один момент, сильно похожий на баг
Создаём скрипт, создаём функцию OnApplicationStart, в ней для отчётности выводим в лог текст "OnApplicationStart" и ставим бесконечный сон на 999999999мс.
Далее в main создаём бесконечный цикл whiletrue
, в нём так же создаём лог для отчётности с текстом "Main", за ним так же бесконечный сон на 999999999мс. И в последнюю очередь в выполнить код объявляем любую бесполезную функцию:function sayhello(){ log("hello") }
Если скрипт запустить в режиме Записи, то он выведет в лог "OnApplicationStart" и уснёт. Всё логично.
Но вот если запустить скрипт в режиме Запуска, то в логе мы увидим сразу "Main", ни какого "OnApplicationStart" не будет.Почему так происходит?
Если выполнить код с бесполезной функцией вывести из бесконечного цикла, то всё работает правильно, как и в режиме Записи. Казалось бы, виноват бесконечный цикл, но если заменить бесконечный цикл на for от 1 до 1, или на if
true
, то ситуация не изменяется.
Вот тестовые скрипты
test с for 1 до 1
test с while true
test с if true
-
Решил сейчас записать гифку и обнаружил совсем уж интересный момент:
Скрипт сперва выполнил действия в Main, а потом начал выполнять OnApplicationStart.
Название функции OnApplicationStart я брал копипастом из меню, так что неправильное имя отпадает. Плюс я ни где в Main не вызывал функцию OnApplicationStart.
Веселье продолжается, если запустить скрипт в 5 потоков, то сперва 5 потоков выполнят Main, а потом первый поток начнёт выполнять OnApplicationStart
Вот скрипт test в 5 потоков
Ну и напоследок, если сон в OnApplicationStart и в Main сделать 5 секунд и запустить в 5 потоков..
То сперва 5 потоков выполнят Main, затем первый поток выполнит OnApplicationStart, потом первый же поток снова выполнит Main и после этого скрипт сообщит о благополучном завершении
-
@fox Прикольно. Бгг Вот запускай теперь с проверкой от бана. Бха-ха
-
При том что так:
Работает правильно,
а вот так:
уже нет
И да, если объявить функцию в начале работы потока, а в if условии её просто вызывать:
то всё будет работать правильно.
-
@fox Почему-то вызов функция OnApplicationStart _call(_on_start, null)! оказался в конце скрипта. Причем если первый действием в скрипте поставить какой-нибудь экшен или из выполнить код убрать функцию, то все будет работать. Более того, если поправить код вручную, то он будет работать. Видимо конструктор где-то блудит. Вот рабочая версия, только если в режиме записи, что-то изменишь, то он снова сломается :D 0_1532146183987_1532119273913-test-в-5-потоков.xml
-
@fox Да, такое возможно, если в действии есть объявление именованой функции.
Но баг не критичный, так как обычно можно обойтись без объявления функции в цикле.
Костыль 1. Вынести все объявления функций в начало скрипта.
Костыль 2. Заменитьfunction sayhello(){ log("hello") }
на
sayhello = function(){ log("hello") }
К следующей версии что-то придумаю. Но вообще код лучше подправить, объявлять фуункцию в цикле - лишний раз напрягать сборщик мусора.