Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Приколы с TriggerSleepAction
Давеча столкнулся с забавной проблемой.
Имеется триггер. Этот смотрит в чат, реагируя на команду, допустим, "-ролик". Далее триггер запускает через ExecuteFunc функцию, отвечающую за выполнение команды. В этой функции имеется обычный вызов через call функции, в которой перечислены все действия ролика. Так вот, всё это дело эпично накрывается медным тазом. Мало того, что TriggerSleepAction не пашут и ролик останавливается, так ещё и половина свистелок и перделок тоже накрываются. Было замечено, что откидывают копыта все игровые таймеры О_О! Зато, если call заменить на ExecuteFunc и вызвать действия ролика по имени функции, всё снова работает. Вопрос. Какой-же всё таки комбинацией надо вызывать функцию, чтобы не боятся, что Wait всё испортит (100% создатся новый, хороший годный поток)? Дано: call, TriggerEvaluate(в ней вейты нельзя), TriggerExecute, ExecuteFunc. Как следует из вышегоописанного, схема Действие триггера->ExecuteFunc->call приносит печаль в наш мир. А вот Действие триггера->ExecuteFunc->ExecuteFunc работает. Есть ли какие-либо трюки с потоками, чтобы гарантированно безопасно запустить функцию с вейтами? Без них в ролике не получается - дробить цельную функцию на 100500 мелких с таймерами - это маразм, имхо, да и времени убить много надо. |
29.01.2010, 14:11 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
ну гадалка в декрете а ваше абстрактное представление о том как работает варкрафт не имеет никакой научной и практической ценности.
код в студию. |
29.01.2010, 14:34 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
|
29.01.2010, 14:38 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Вот такой лолкод:
» раскрыть Код:
[i]Preveder добавил: Bee, читал. Я знаю, что ExecuteFunc в теории должна запускать новый поток, но в моём случае есть загвоздки. |
29.01.2010, 14:44 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
и где хоть одно ожидание?
и вообще писать статичные стракты тем более таким образом насилие над движком оно же компилируется в жуткую кашу. |
29.01.2010, 14:45 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Цитата:
В функции, отвечающей за ролик. Сначала триггер работает функцией commandaction. Затем, функция commandaction вызывает ConsoleCommandRolik через ExecuteFunc (в теории, уже создался новый поток). И вот в этой-то функции вызов функции с действием самого ролика. Т.е. по идее через call она должна идти в одном потоке. И тут вейты не работают. Тогда через создание ещё одного потока: Код:
Все механика этой "консоли" выше. Отредактировано Preveder, 29.01.2010 в 14:59. |
|
29.01.2010, 14:50 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
я бы сразу делал на таймерах - куда меньше подводных камней |
29.01.2010, 15:09 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Ответа на вопрос "100% верная комбинация для запуска функции с ожиданиями" не получил.
Но предполагаю, что будет верным в данном случае создание триггера-контейнера с функцией в действиях. То бишь TriggerExecute(). Единственный минус - триггер надо создавать. Либо, получается, ExecuteFunc->ExecuteFunc чтоб уж наверняка. :) Но мне не нравится, что надо постоянно следить за именами функций в данном варианте. Поменял имя, забыл - лови фатал, сиди разбирай, где накосячил. Теперь юзаю первый вариант, всё устраивает. :) |
29.01.2010, 16:08 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
покажи код с ожиданиями а не левую систему, зачем вообще ты этот левый код выложил? |
29.01.2010, 17:57 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Цитата:
Вот, собственно, кусок кода функции с роликом: Код:
Всё что до первого Wait - выполняется, после - камера не трясётся, и так далеe... Вся функция короче обрывается. И вместе с ней - половина триггерного функционала (таймеры убиваются и т.д.). |
|
29.01.2010, 18:08 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
что за группа_игроков ? нихрена не понятно с коде. ты 100% знаешь что функция обрывается? принт юзал? |
29.01.2010, 19:06 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
ScorpioT1000, естественно юзал мессагу. Ставил перед вейтом и после. Перед вейтом - показывалось, после - пусто.
Группа игроков - это force, для игроков которой выполняется Enum-функция. Отредактировано Preveder, 29.01.2010 в 19:16. |
29.01.2010, 19:11 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
что за группа? просто всякие GetTrigger... после вейта не пашут. хм, хотя они и так не должны пахать. и вобще execute не надо, каждый триггер и так новый поток |
29.01.2010, 19:21 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Цитата:
Я просто переименовал названия переменных в более короткий вид для читабельности, чтобы функция на всю ширину моего поста не разъежалась. Никаких "опасных" функций там нет. Проблема в общем-то решена. Но почему цепочка вызовов 1 Действие триггера || 2 Вызов функции через ExecuteFunc || 3 Вызов функции через call даёт нерабочие вейты, это загадка. По идее, 2) создаёт поток, и call уже в нём исполняется. Странно. Приходится почему-то ещё один поток вызывать. |
|
29.01.2010, 19:42 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
я не понимаю, зачем экзекут?
|
29.01.2010, 19:49 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
ScorpioT1000, таким образом работает мой триггер, 4 пост сверху в теме.
|
29.01.2010, 20:34 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
вобщем, я могу сказать только что в экзекученной ф-ции вейты должны пахать хорошо. попробуй локализировать ошибку, сделать другое событие |
30.01.2010, 23:12 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
просто гениальная система автора вешает поток. |
31.01.2010, 06:26 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
ну да, скорее всего, только не вижу, чему вешать |
31.01.2010, 10:06 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
ты не заметил что автор выкладывает какойто бутор вместо кода? |
31.01.2010, 10:21 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|