Игнорирование OnApplicationStart


  • administrators

    Случайно обнаружил один момент, сильно похожий на баг


    Создаём скрипт, создаём функцию OnApplicationStart, в ней для отчётности выводим в лог текст "OnApplicationStart" и ставим бесконечный сон на 999999999мс.
    0_1532118192973_на форум 24.png
    Далее в main создаём бесконечный цикл while true, в нём так же создаём лог для отчётности с текстом "Main", за ним так же бесконечный сон на 999999999мс. И в последнюю очередь в выполнить код объявляем любую бесполезную функцию:

    function sayhello(){
        log("hello")
    }
    

    0_1532118211610_на форум 25.png


    Если скрипт запустить в режиме Записи, то он выведет в лог "OnApplicationStart" и уснёт. Всё логично.
    Но вот если запустить скрипт в режиме Запуска, то в логе мы увидим сразу "Main", ни какого "OnApplicationStart" не будет.

    Почему так происходит?


    Если выполнить код с бесполезной функцией вывести из бесконечного цикла, то всё работает правильно, как и в режиме Записи. Казалось бы, виноват бесконечный цикл, но если заменить бесконечный цикл на for от 1 до 1, или на if true, то ситуация не изменяется.


    Вот тестовые скрипты
    test с for 1 до 1
    test с while true
    test с if true


  • administrators

    Решил сейчас записать гифку и обнаружил совсем уж интересный момент:
    0_1532118991522_на форум 26.png
    Скрипт сперва выполнил действия в Main, а потом начал выполнять OnApplicationStart.


    Название функции OnApplicationStart я брал копипастом из меню, так что неправильное имя отпадает. Плюс я ни где в Main не вызывал функцию OnApplicationStart.


    Веселье продолжается, если запустить скрипт в 5 потоков, то сперва 5 потоков выполнят Main, а потом первый поток начнёт выполнять OnApplicationStart
    0_1532119231931_на форум 27.png
    Вот скрипт test в 5 потоков


    Ну и напоследок, если сон в OnApplicationStart и в Main сделать 5 секунд и запустить в 5 потоков..
    То сперва 5 потоков выполнят Main, затем первый поток выполнит OnApplicationStart, потом первый же поток снова выполнит Main и после этого скрипт сообщит о благополучном завершении
    0_1532119542491_на форум 28.png



  • @fox Прикольно. Бгг Вот запускай теперь с проверкой от бана. Бха-ха


  • administrators

    При том что так:
    0_1532132580750_на форум 30.png
    Работает правильно,


    а вот так:

    0_1532132607375_на форум 29.png

    уже нет


    И да, если объявить функцию в начале работы потока, а в if условии её просто вызывать:
    0_1532132948190_на форум 31.png
    то всё будет работать правильно.



  • @fox Почему-то вызов функция OnApplicationStart _call(_on_start, null)! оказался в конце скрипта. Причем если первый действием в скрипте поставить какой-нибудь экшен или из выполнить код убрать функцию, то все будет работать. Более того, если поправить код вручную, то он будет работать. Видимо конструктор где-то блудит. Вот рабочая версия, только если в режиме записи, что-то изменишь, то он снова сломается :D 0_1532146183987_1532119273913-test-в-5-потоков.xml


  • administrators

    @fox Да, такое возможно, если в действии есть объявление именованой функции.
    Но баг не критичный, так как обычно можно обойтись без объявления функции в цикле.
    Костыль 1. Вынести все объявления функций в начало скрипта.
    Костыль 2. Заменить

    function sayhello(){
        log("hello")
    }
    

    на

    sayhello = function(){
        log("hello")
    }
    

    К следующей версии что-то придумаю. Но вообще код лучше подправить, объявлять фуункцию в цикле - лишний раз напрягать сборщик мусора.