Собственно, недавно опять случилось столкновение с принудительным завершением потока.
Поскольку уже прямо впихиваю в war3map.j, файл был открыт блокнотом и прямо там прямо в InitCustomTriggers несколько вызовов функций переписано на ExecuteFunc, проблема исчезла.
И возник вопрос: а почему вообще сразу все функции подобным образом не айнитятся через ExecuteFunc в разных потоках, чтобы проблемы принудительного завершения потока вообще не существовало? Чем это нехорошо?

потому что близзарды с подобным не сталкивались
`
ОЖИДАНИЕ РЕКЛАМЫ...
16
потому что близзарды с подобным не сталкивались
Принятый ответ
22
еще если так запустить слишком много потоков варик фаталит
пробовал сделать большой цикл через execute, но пришлось разбивать на части с задержкой таймерами по 0 сек, хотя потоки и запускались один за другим а не одновременно
21
biridius, о, так-так, спс за инфу, а то была уже мысль все call переписать на ExecuteFunc
и насколько большой цикл вызывал фатал?
22
ClotPh, хз, не измерял, цикл был для поиска пути или расчета движения юнитов по шкале инициативы, уже не помню
но в районе 20 экзекутов, не много
12
biridius:
ClotPh, хз, не измерял, цикл был для поиска пути или расчета движения юнитов по шкале инициативы, уже не помню
но в районе 20 экзекутов, не много
В первый раз слышу про такую проблему. У меня в цикле экзекут вызывался до примерно 1000-ти раз за один цикл (по 5-10 раз на каждый юнит на карте), без каких-либо вылетов.
22
Sergarr, 5-10 раз из forgroup?
у меня одни экзекуты вызывали другие экзекуты, но как разбил чтобы каждые 10 итераций был таймер на 0, заработало
28
biridius, у тебя не количество потоков было а переполнение стэка вызовов
подобное можно наблюдать у любой рекурсии с большим количеством итераций
22
nvc123, а, т. е. потоки от экзекутов запоминают откуда их вызвали, чтобы потом вернуть из стека локальные переменные или что там, как обычные подпрограммы?
и все эти потоки не закрывались, пока не выполнятся следующие итерации?
есть статья хорошая по потокам?
12
biridius:
Sergarr, 5-10 раз из forgroup?
у меня одни экзекуты вызывали другие экзекуты, но как разбил чтобы каждые 10 итераций был таймер на 0, заработало
Нет, там обычный цикл по всем юнитам из группы (через временную группу и FirstOfGroup), который вызывает экзекут функции поочередно для каждого юнита (ну если быть точным, то каждого 5-го юнита, потому что если делать для всех юнитов сразу, то идут заметные лаги), внутри которого вызывается еще куча экзекутов вспомогательных функций. И все отлично работает.
28
biridius, и для того чтобы вернутся в то место откуда их вызвали
не стоит забывать что хоть в варе это и называют "поток" но на самом деле джасс код выполняется в 1 поток
т.е. поток в варе не является системным потоком (Thread)
22
блин с телефона минус вместо плюса поставился
т. е в конце экзекута он возвращается туда откуда был вызван?
Sergarr, ясн значит если экзекуты не звать из экзекутов то можно спамить сколько угодно. А если цикл максимально длинный, сколько там 300000 операций?
28
кстати инициализация библиотек происходит через ExecuteFunc
т.е. просто используй библиотеки вместо гуишных триггеров и будет тебе счастье
biridius:
т. е в конце экзекута он возвращается туда откуда был вызван?
верно
простой тест с выводом текста это подтверждает
Чтобы оставить комментарий, пожалуйста, войдите на сайт.