Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Расходование памяти (http://www.flasher.ru/forum/showthread.php?t=92735)

atari 05.03.2007 13:24

Расходование памяти
 
Забивается память или нет?

Есть 3 ф-ии в статическом классе
В первой SetInterval'ом обращаемся ко второй
Во второй очищаем его и обращаемся SetInterval'ом к третьей
В третьей очищаем его и снова обращаемся к первой функции

Код:

public static var intervalTimerChangeBanner:  Number;
public static function initTimerChangeBanner  (): Void {
intervalTimerChangeBanner = setInterval (function () : Void {
                timerChangeBanner ();
        }, 1000)
}
public static function timerChangeBanner (): Void {
        if (что-то ) {
                clearInterval(intervalTimerChangeBanner);
                ...

                intervalTimerChangeBanner = setInterval (function () : Void {
                        timerLoadBanner ();
                }, 300)               
        }
}
public static function timerLoadBanner (): Void {
        if ( что-то) {
                clearInterval(intervalTimerChangeBanner);
                initTimerChangeBanner ();
        }
}


etc 05.03.2007 14:00

Цитата:

Сообщение от atari
Забивается память или нет?

Твой класс, ты и должен ответить на этот вопрос. Если я скопирую класс ради теста, он у меня:
а) не заработает;
б) даже если заработает, показывать он ничего не будет.

atari 05.03.2007 14:50

Меня интересует в общем при таком подходе стек очищается от третьей функции или забивается?

etc 05.03.2007 15:01

Нет, к сожалению, времени для прогона тестов, но я бы для начала переписал код:

Код:

class Example {
    public static var intervalTimerChangeBanner:Number;

    public static function initTimerChangeBanner():Void {
        Example.intervalTimerChangeBanner = setInterval(Example,'timerChangeBanner', 1000);
    }
    public static function timerChangeBanner():Void {
        if (что-то) {
            clearInterval(Example.intervalTimerChangeBanner);
            …
            Example.intervalTimerChangeBanner = setInterval(Example,'timerLoadBanner', 300);
        }
    }
    public static function timerLoadBanner():Void {
        if (что-то) {
            clearInterval(Example.intervalTimerChangeBanner);
            Example.initTimerChangeBanner ();
        }
    }
}


Iv 06.03.2007 01:49

если требуется вызов интервала единожды, то лучше сделать специальный метод setTimer, в котором прописать самоочистку:
Код:

class MyClass {

private static function setTimer (delay:Number, callback:Function, args:Array):Void {
  var interval:Number = setInterval(
    function () {
      clearInterval(interval);
      callback.apply(MyClass, args);
    }, delay || 0
  );
}

..........................

}

в этом раскладе ты гарантирован от неприятной ошибки: если интервал задан, то он обязательно очистится.
тогда твой код метод initTimerChangeBanner будет выглядеть вот так:
Код:

public static function initTimerChangeBanner  (): Void {
    setTimer (1000, timerChangeBanner);
}

ну и так далее...

а память забиваться не будет. не беспокойся.

iNils 06.03.2007 01:56

Учитывая, что в AS3 уже документированы setTimeout/clearTimeout, то логично предположить, что данные методы недокументированные для 8-го плеера, будут описаны для него в флеш 9.

Iv 06.03.2007 02:10

да здесь это обычный пользовательский метод.
никакого хака.

etc 06.03.2007 02:43

Цитата:

Сообщение от Iv
никакого хака.

Объявление функции внутри метода таким образом, имхо, плохо.

Iv 06.03.2007 21:18

- в таком случае, создание одного объекта в другом объекте тоже плохо.

я думаю, что плохо, когда втыкается огромная функция, с которой попросту неудобно в таком случае работать.
а на паре строк особо не пострадает ни читабельность, ни юзабилити ни анбаггити :).

меня гораздо больше напрягает перспектива передавать имена методов стрингой.
имея ввиду: 'timerChangeBanner'.

etc 06.03.2007 23:10

Ну шо ж поделать, это setInterval.

Arsentev 09.03.2007 01:59

Я, конечно, не говорю, что это лучший выход, и уж тем более продуктивный, но можно использовать аналогичные классы для всех случаев жизни:

Код:

class Timer{
    private var _id : Number;
    private var _interval : Number = 1000;
    private var _active : Boolean = false;
    public  var _loop : Boolean = true;
    public function get id():Number { return(this._id) }
    public function set interval(_value:Number):Void {
        if (not isNaN(_value)){
            this._interval=_value;
            if (this._active){ this.Reload() }
        }
    }
    public function get interval():Number { return this._interval }
    public function set active(_value:Boolean):Void {
        if (_value){ this.StartTimer() } else { this.StopTimer() }
    }
    public function get active():Boolean { return this._active }
    public function onTimer(){}
    private function onUpdate(){
        this.onTimer();
        if (not this._loop) { this.StopTimer(); }
    }
    private function StopTimer():Void {
        this._active=false;
        clearInterval(this._id);
    }
    private function StartTimer():Void {
        this._active=true;
        clearInterval(this._id);
        this._id = setInterval(this,"onUpdate",this._interval);
    }
    public function Reload():Void {
        this.StopTimer();
        this.StartTimer();
    }
    function Timer(val_interval, val_active) {
        this._interval=val_interval;
        if (val_active) { this.StartTimer() }
    }
}

Использование:

Код:

var T:Timer = new Timer(300, true);
T.loop = false;
T.onTimer = function (){
    //делать что-то
}

PS. За простоту не ругайте (написал за 15 минут:rolleyes:), зато функционально, а loop параметр можно заделать числовым, и назначать количество повторяемых раз.

etc 09.03.2007 02:03

А почему у вас имена методов похожи на имена классов?

Arsentev 09.03.2007 02:15

Главное ошибок нет, а такие названия - мой стиль написания. Кому не нравится может исправить :)

etc 09.03.2007 02:16

Нет, есть общепринятые стандарты. Если вы показываете и даете использовать код, то он должен удовлетворять хотя бы какому-нибудь общепризнанному стандарту, а не собственному стилю написания.

Arsentev 09.03.2007 02:20

А ссылочку можно на стандарты, а то куда ни глянь - у всех по разному, вот и приходится писать по-своему, зато везде одинаково

etc 09.03.2007 02:26

Ну например:
http://www.adobe.com/devnet/flash/ar...ctices_02.html
http://java.sun.com/docs/codeconv/ht...nvTOC.doc.html

iNils 09.03.2007 02:27

Зачем ссылку, я и так скажу:
Имена классов пишут с БольшойБуквы, а имена методов и свойств с маленькойБуквы. КОНСТАНТЫ_ПИШУТ_ТАК.

Arsentev 09.03.2007 02:29

Усвоил

CCCPirate 09.03.2007 02:37

никак не могу себя заставить писать имена методов с маленькой)))

Arsentev 09.03.2007 02:43

Цитата:

Сообщение от CCCPirate
никак не могу себя заставить писать имена методов с маленькой)))

Это ещё пол беды, я за 5 лет не научился писать комментарии на русском языке всё время лень клаву переключать:rolleyes:

CCCPirate 09.03.2007 03:01

Я комментарии вообще не пишу: мозг должен тренироваться разгребать код - и что самое интересное тренировки дают положительный результат.)))

iNils 09.03.2007 03:01

Цитата:

Сообщение от CCCPirate
никак не могу себя заставить писать имена методов с маленькой)))

Удали клавишы шифт и капслок :)

CCCPirate 09.03.2007 03:04

Цитата:

Сообщение от iNils
Удали клавишы шифт и капслок :)

Ты б еще пальцы на левой руке удалить посоветовал.:)

iNils 09.03.2007 03:06

Ладно, пофлеймовали и хватит.


Часовой пояс GMT +4, время: 19:55.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.