Добавлен
Недавно узнал, что у "TriggerSleepAction" есть минимальное кол-во времени, решил сделать что-то похожее при помощи таймера, т.к. везде только про него и пишут. Внутри "PolledWait" использовался TimerGetRemaining(), но у меня не получилось его реализовать, т.к. значение даже при истечении таймера у TimerGetRemaining() выходит всегда одно, условие для выхода из цикла не выполняется. Не мог бы кто подсказать, что я делаю не так.
function Trig_TESTWAIT_Actions takes nothing returns nothing
local real i = 1
local timer t
set t = CreateTimer()
call TimerStart(t, 1, false, null)
loop
exitwhen i <= 0
set i = TimerGetRemaining(t)
endloop
call RemoveUnit(gg_unit_Hpal_0000)
call DestroyTimer(t)
set t = null
set real i = 0
endfunction

KalaKoltes, обычная функция TriggerSleepAction работает в циклах. Здесь изобретение велосипеда не нужно, но когда нужно выполнить какое действие через промежуток времени без обрывания потока, то тут понадобятся ухищрения с таймером и передача аргументов в функцию таймера через хэш-таблицу, структуру, TimerExploit или глобалки.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
13
В оригинальном PolledWait присутствует TriggerSleepAction, чтобы избежать зависание цикла. В твоем примере цикл постоянно сверяется с таймером и зависает от превышения количества допустимых итераций, как бесконечный. Они в варе недопустимы. Если интереса данная конструкция, то можешь изучить структуру стандартного PolledWait.
Код функции
function PolledWait takes real duration returns nothing
    local timer t
    local real  timeRemaining

    if (duration > 0) then
        set t = CreateTimer()
        call TimerStart(t, duration, false, null)
        loop
            set timeRemaining = TimerGetRemaining(t)
            exitwhen timeRemaining <= 0

            // If we have a bit of time left, skip past 10% of the remaining
            // duration instead of checking every interval, to minimize the
            // polling on long waits.
            if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then
                call TriggerSleepAction(0.1 * timeRemaining)
            else
                call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
            endif
        endloop
        call DestroyTimer(t)
    endif
endfunction
2
Можно ли тогда остановить триггер на определенном моменте и возобновить при выполнении конкретного условия?
Не знал, что цикл может зависать. Пытался с его помощью "отсрочить" выполнение остатка функции, пока остаток таймера не станет равен нулю.
30
Таймеры запускают привязанную функцию по своему истечению, в этой функции и нужно совершать все действия после ожидания. Да, пробрасывать локальные переменные туда нельзя.
13
Clamp:
Таймеры запускают привязанную функцию по своему истечению, в этой функции и нужно совершать все действия после ожидания. Да, пробрасывать локальные переменные туда нельзя.
Если это необходимо, то нужно организовать работу с хэш-таблицей или структурой (или глобалками на крайний случай).
2
Получается, просто искусственный "Wait", но с ожиданием примерно в 0.1 секунды, для того, чтобы использовать его в циклах, нельзя?
13
KalaKoltes, обычная функция TriggerSleepAction работает в циклах. Здесь изобретение велосипеда не нужно, но когда нужно выполнить какое действие через промежуток времени без обрывания потока, то тут понадобятся ухищрения с таймером и передача аргументов в функцию таймера через хэш-таблицу, структуру, TimerExploit или глобалки.
Принятый ответ
28
KalaKoltes, "ожидание" и "сделать через некоторое время" разные вещи
для первого есть вейт и он прекрасно справляется
для второго юзают таймеры
в твоём случае именно 2 вариант
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.