Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Пара слов о работе и правильном использовании ивентов

Часто задаваемые вопросы
Post Reply
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Пара слов о работе и правильном использовании ивентов

Post by Vizit0r »

Итак, как устроен механизм ивентов.

Вызов ивентов происходит при вызове Wait в скрипте, необязательно напрямую, но и внутри других методов, типа ходилки или ожидания в WaitJournalLine и прочих.

Вообще Wait не ждет заданный пользователем период целиком, он разбивается на куски в 20 мс. После каждого 20 мс ожидания идет проверка на наличие ивентов в очереди, если есть - вызываются один за другим, последовательно, в порядке добавления в очередь.


Из этого вытекает, что в процедурах - обработчиках ивентов НЕЛЬЗЯ ставить долгие (или вечные) циклы, долгие по времени действия и все такое. Да и вообще, чем быстрее выполнится обработчик ивента - тем быстрее придет очередь на выполнение следующего. Особенно это актуально для evTimer, которые добавляются в очередь каждые 100 мс, и если обработчик будет выполняться дольше, чем эти 100мс - то события будут скапливаться в очереди и довольно быстро переполнят стек и обрушат скрипт. А винить будут опять стелс, в котором-де ни с того ни с сего умирают скрипты.


вот свежайший пример категорического непонимания работы системы ивентов:
решил проверить паралельность и блокирование - делаю в обработчике OnSpeech:

while true do begin
AddToSystemJournal(Text);
Wait(1000);
end;

и затем в игре в чат пишу 1 потом 2 потом 3

в System-логе в это время пишется "1" раз в секунду. о "2" и "3" ни слова

потом если нажать СТОП скрипу в систем локе появляется спам "2" судя по времени по 20 штук с одной милисекундной меткой

если второй раз нажать СТОП скрипт в систем логе появляется аналогичный спам "3" тоже каждую тысячную милисекунды п0 100 раз
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Пара слов о работе и правильном использовании ивентов

Post by Vizit0r »

если что-то непонятно - пишите тут, исправлю-дополню.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Post Reply