Мне уже лет 5 твердят,что команда "wait" утечна. Объясните раз и навсегда,чем заменить команду ждать? Спасибо"

SсRealm, я скопировал PolledWait() и исправил немного, можешь скопировать и вызывать когда нужно. (Если я правильно исправил)
//Исправленный PolledWait()
    nothing Wait ( real duration ){ 
        timer t
        real timeRemaining
        if (duration > 0) {
            t = CreateTimer()
            TimerStart(t, duration, false, null)
            loop{
                timeRemaining = TimerGetRemaining(t)
                exitwhen timeRemaining <= 0
                if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) {
                    TriggerSleepAction(0.1 * timeRemaining)
                }else{
                    TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
                }
            }
            DestroyTimer(t)
            t = null
        }
    }
Это cJASS, если что
`
ОЖИДАНИЕ РЕКЛАМЫ...
15
Тебе действительно за эти 5 лет никто не рассказал о таймерах?
28
Мне уже лет 5 твердят,что команда "wait" утечна.
PolledWait не обнуляет переменную таймера, вот и всё. Это не утечка, но хендл не освобождается.
21
Разве она утечна? Никогда о подобном не слышал. Везде говорится лишь что она не подходит для реализации манипуляций с высоким периодом.
Открой PolledWait (Или как там ее) в JNGP и все поймешь с первого взгляда.
21
GetLocalPlayer:
Тебе действительно за эти 5 лет никто не рассказал о таймерах?
Нет Ни кто(
20
Raised, тоесть PolledWait() можно даже использовать в способностях и все будет хорошо работать?
21
PolledWait не обнуляет переменную таймера
Если это утверждение верно, то да, но только с глобальными таймерами.
38
Можно смело юзать чистый TriggerSleepAction для всяких кветов или сценариев, но он продолжает работать в паузе игры, т.е. лучше реализовать свой PolledWait, устранив утечку. Для точности ниже 0.27 сек (зависит от машины) нужно юзать таймеры
21
Дайте мне ссылку как использовать таймеры и на PolledWait?
38
могу вот это предложить, для общего образования xgm.guru/p/wc3/code-flow-and-data-access-thread
28
Если это утверждение верно
Классика blizzard.j, объект удаляется, но переменная на него не обнуляется.
20
ScorpioT1000, нужно сначала уничтожать таймер, затем обнулять?
21
PT153:
Если это утверждение верно
Классика blizzard.j, объект удаляется, но переменная на него не обнуляется.
Ну так,а мы обнулим переменную))
KaneThaumaturge:
ScorpioT1000, нужно сначала уничтожать таймер, затем обнулять?
А как уничтожить таймер?
26
KaneThaumaturge:
ScorpioT1000, нужно сначала уничтожать таймер, затем обнулять?
а что, как то по другому делать это можно? оч интересно посмотреть как вы будете удалять таймер на который не будет ссылок)
28
Ну так,а мы обнулим переменную))
Она локальная, как ты её обнулишь вне её функции? Только если свой аналог напишешь.
20
Hate:
как и делается 70% всего на этом форуме - танцами с бубном
21
PT153:
Ну так,а мы обнулим переменную))
Она локальная, как ты её обнулишь вне её функции? Только если свой аналог напишешь.
custom script: u = null
у нас,триггерщиков, локалки так обнуляются , а у вас не знаю(
28
custom script: u = null
Только если эту локалку ТЫ сделал. А тут локальная переменная записана в blizzard.j, и ты никак её не обнулишь.
20
SсRealm, я скопировал PolledWait() и исправил немного, можешь скопировать и вызывать когда нужно. (Если я правильно исправил)
//Исправленный PolledWait()
    nothing Wait ( real duration ){ 
        timer t
        real timeRemaining
        if (duration > 0) {
            t = CreateTimer()
            TimerStart(t, duration, false, null)
            loop{
                timeRemaining = TimerGetRemaining(t)
                exitwhen timeRemaining <= 0
                if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) {
                    TriggerSleepAction(0.1 * timeRemaining)
                }else{
                    TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
                }
            }
            DestroyTimer(t)
            t = null
        }
    }
Это cJASS, если что
Принятый ответ
38
Моя версия на cjass (2010), меняет все слипы на себя, в том числе в гуи
void Sleep(real duration) {
    timer t
    real y
    if (duration>0.1) {
        y = duration-0.1
        t=CreateTimer()
        TimerStart(t,y,false,null)
        whilenot(TimerGetRemaining(t)<=0.0) {
            Trigger##SleepAction(0.01)
        }
        DestroyTimer(t)
        t=null
    } else {
        Trigger##SleepAction(duration)
    }
}

#define TriggerSleepAction(r) = Sleep(r)
20
А зачем #define TriggerSleepAction(r) = Sleep(r), он же не заменит к примеру TriggerSleepAction(2)
38
Всё заменит, r - параметр, изучайте мануал cJass для подробностей
13
 local real timeRemaining
 local real st=TimerGetElapsed( bj_gameStartedTimer)
    if st <= 0 then
        set bj_gameStartedTimer = CreateTimer()
        call TimerStart(bj_gameStartedTimer, 1000000, false, null)
    endif
    if (duration > 0) then
        loop
            set timeRemaining = duration - TimerGetElapsed( bj_gameStartedTimer) + st
            exitwhen timeRemaining <= 0
            if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then
                call TriggerSleepAction(0.1 * timeRemaining)
            else
                call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
            endif
        endloop
    endif
endfunction
Есть еще такая старая функция.
21
KaneThaumaturge:
SсRealm, я скопировал PolledWait() и исправил немного, можешь скопировать и вызывать когда нужно. (Если я правильно исправил)
//Исправленный PolledWait()
    nothing Wait ( real duration ){ 
        timer t
        real timeRemaining
        if (duration > 0) {
            t = CreateTimer()
            TimerStart(t, duration, false, null)
            loop{
                timeRemaining = TimerGetRemaining(t)
                exitwhen timeRemaining <= 0
                if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) {
                    TriggerSleepAction(0.1 * timeRemaining)
                }else{
                    TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
                }
            }
            DestroyTimer(t)
            t = null
        }
    }
Это cJASS, если что
Пасиба)
32
Как насчет не юзать вовсе вейтов в спеллах, вейты нужны для сикнхов и синиматиков, но никак не для спеллов.
Существуют таймеры и триггеры.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.