Мне уже лет 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, если что
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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 для подробностей
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.