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

Принятый ответ

потому что близзарды с подобным не сталкивались
`
ОЖИДАНИЕ РЕКЛАМЫ...

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