Лимит операций (op-limit) и как создать поток вручную

Добавлен , опубликован

Выполнение кода и обращение к данным

Содержание:
А теперь сюрприз! Каждый jassVM поток в Warcraft 3 имеет лимит операций. Как только выполнится определенное количество операций, варкрафт экстренно завершает поток и даже не сообщает об этом.
Скорее всего, это было сделано, чтобы избежать бесконечных циклов и различных ошибок зависания, допущеных дизайнерами во время написания карт Blizzard.
Подробнее про лимит операций с примерами можно посмотреть в теме XGM Forum - Прерывание потоков & limit op.

Что же теперь делать?!

За простые потоки волноваться не надо, а вот за поток инициализации различных баз данных стоит побеспокоиться и разбить его на новые jassVM потоки.

Как создать новый jassVM поток

Создать поток можно запуском одноразового таймера с минимальной задержкой, но в редких случаях я предлагаю не заморачиваться с таймерами и использовать функцию ExecuteFunc().
Простой пример:
function test3 takes nothing returns nothing
	много кода
endfunction

function test2 takes nothing returns nothing
	много кода
	call ExecuteFunc("test3")
endfunction

function test1 takes nothing returns nothing
	много кода
	call ExecuteFunc("test2")
endfunction

// ...
	call test1()
Пример с передачей параметров. Внимание: это работает хорошо только в Warcraft 3 и подобных! Как раз из-за того замечания про потоки.
На других, современных языках программирования появится проблема синхронизации данных.
globals
	unit test_receive_u = null
	int test_receive_i = 0
endglobals

function test_receive takes nothing returns nothing
	local unit u = test_receive_u
	local int i = test_receive_i
	
	// ваш код, глобальные в нем не используются,
	// потому что они могут быть перезаписаны другим потоком
	
endfunction

function test_send takes nothing returns nothing
	local unit u
	local int i
	
	// ваш код
	
	// передача аргументов в новый поток и создание нового потока
	set test_receive_u = u
	set test_receive_i = i
	call ExecuteFunc("test_receive")
	
	// Здесь внимание! Даже если вы вызовете TriggerSleepAction, 
	// новый поток продолжит выполняться. И это хорошо! =)
	
	// ваш код, например, обнуление (но не удаление) локальных юнитов
endfunction
Ещё два примера: раз, два.

`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
38
Со слипами я не пробовал продлевать поток, но похоже, у потока должен сохраняться счетчик операций, значит, он в итоге всеравно прибьётся.
Этот комментарий удален
35
ScorpioT1000, нет именно что не в триггере. А во всей карте лимит. Типа лимит триггеров. Это как-то решаемо?
Т.е. Триггеры нормальной длинны. А если какие-то ругались то я их разбивал на два. А тут столкнулся с тем что при каком-то кол-ве действий в целом в карте, карта вообще перестаёт работать и выдаёт ошибку при сохранении.
Это было при создании годс ворд. Хейт мне сделал крутую систему боя с кучей параметров. У него всё работало. А когда запихнул в карту соблюдя все инструкции ошибку выдавало.
27
возможно лимит при инициализации триггеров?
35
МрачныйВорон, я точно не знаю. Но я добавил тонну кода в карту и после этого перестала запускаться карта и выдаёт ошибку. Я уже убрал эту систему и всё пашет. Это надо спрашивать у моего кодера Hate. Давно дело было. Но он мне тогда сказал, что это не решаемо в варике.
38
выдаёт ошибку при сохранении
Какую?
35
ScorpioT1000, если б я помнил) Это было в 2017 году вроде как. Слишком много воды утекло. Мб хейт упомнит. Суммоню его сюда)
8
PUVer,
Карту в студию, можно даже отдельным вопросом
27
МрачныйВорон, я точно не знаю. Но я добавил тонну кода в карту и после этого перестала запускаться карта и выдаёт ошибку. Я уже убрал эту систему и всё пашет. Это надо спрашивать у моего кодера Hate. Давно дело было. Но он мне тогда сказал, что это не решаемо в варике.
Там есть main func, где возможна инициируют кучу триггеров. Если их оч много. Поток наверн обрывается от больших действии. Можно разбить на части, на отдельные функции. И в mian func через ExecuteFunc вызывай отдельные функции.
Но если Hate сказал, то значит и правду нельзя починить.
35
МрачныйВорон, речь была о лимите не операций в триггере. А есть ещё лимит операций в карте. Т.е. возможности варика ограничены. А т.к. у меня 200к символов диалогов. То я до этого добрался. Ну хейт пояснит.
27
в дискарде все коты xgm сидят, ловят комп мышку. и кафуют от аниме.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.