Строка 70: |
Строка 70: |
| | | |
| Когда кто-то в первый раз заходит в комнату, триггер устанавливается и смертельный код откладывается. Операция ''enter'' продолжает информировать каждого входящего о том, сколько времени осталось. Когда наступает нужный момент, грязное дело совершается внутри отсроченного блока кода. Заметьте, что когда отложенный код выполняется, он автоматически останавливается в конце блока, как будто это совершенно другая операция. | | Когда кто-то в первый раз заходит в комнату, триггер устанавливается и смертельный код откладывается. Операция ''enter'' продолжает информировать каждого входящего о том, сколько времени осталось. Когда наступает нужный момент, грязное дело совершается внутри отсроченного блока кода. Заметьте, что когда отложенный код выполняется, он автоматически останавливается в конце блока, как будто это совершенно другая операция. |
| + | |
| + | == Расчет времени == |
| + | Когда интенсивно используется выполнение в реальном времени, полезно знать то, как всё это происходит изнутри. Этот раздел описывает шестеренки и пружины, благодаря которым мир тикает. |
| + | |
| + | === Потоки выполнения === |
| + | Мир DM - '''однопоточный'''. Это значит, что только один кусок кода может выполняться одновременно. В другом случае, вам бы пришлось заботиться о гораздо большем количестве потенциальных проблем в коде. Например, если бы отсроченный блок кода, наподобие предыдущего примера, удалял объекты из мира, могли бы возникнуть проблемы, в случае, когда эти объекты используются одновременно другим кодом. Если бы код попытался получить доступ к переменным или операциям удаленных объектов, это привело бы к завершению, возможно, оставляя некоторые важные операции незаконченными. |
| + | |
| + | ''Если хотите параллелей, собственно говоря, вы можете рассекать мир на многочисленные сервера. Если бы у вас было много CPU в одном компьютере или множество компьютеров, вы бы создали параллельные вселенные!'' |
| + | |
| + | С тех пор, как существует только одиночный непрерывный поток выполнения, вы можете быть увереннее, когда пишете код. Между одной командой и следующей, ничего не происходит. Если объект существует в конце одной команды, то он будет существовать и в начале следующей. |
| + | |
| + | Единственным исключением в этом правиле являются спящие операции. В этом случае, вам следует осознавать, что всё что угодно может произойти во время паузы. Например, переменная, относящаяся к объекту, может обнулиться, потому что объект был удален. Перед тем как полагаться на спящую команду, следует всё перепроверить, чтобы убедиться, что ничего не произошло. |
| + | |
| + | Переменная ''src'' используется как раз для этого. Когда src спящей операции удаляется, сама операция отменяется. Это почти всегда дает желаемый результат и проблема точной проверки отпадает. Если вы не хотите, чтобы операция отменилась, вам всегда следует ставить переменную ''src'' на ноль перед засыпанием. Это делает операцию независимой от существования ''src'' объекта. |