Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как убить счетчик. Не работает Timer.stop() (http://www.flasher.ru/forum/showthread.php?t=140169)

TOKIO 22.05.2010 00:34

Как убить счетчик. Не работает Timer.stop()
 
од из Колина Мука, который я пытался скомпилировать, содержал не поддерживаемый уже класс счетчика, который я заменил на класс Timer. Счетчик создать удалось, проблема в том, как его остановить. Timer.stop() не работает. Без остановки всё нормально компилируется и запускается.

Код AS3:

package zoo {
 import flash.utils.Timer;
 import flash.events.TimerEvent;
 
 internal class VirtualPet {
  private static var maxNameLength = 20;
private static var maxCalories = 2000;
private static var caloriesPerSecond = 200;
 
  private var petName;
private var currentCalories = VirtualPet.maxCalories/2;
  private var creationTime;
 
  public function VirtualPet (name) {
    setName(name);
  var digestIntervalID:Timer = new Timer(1000, 0);
  digestIntervalID.addEventListener(TimerEvent.TIMER, digest);
  digestIntervalID.start( );
  }
 
// часть кода вырезана
 
public function getName ( ) {
return petName;
}
 
private function digest( ) {
  if (currentCalories - VirtualPet.caloriesPerSecond <= 0) {
 trace (getName( ) + " has died.");
 digestIntervalID.stop( );
  } else {
currentCalories -= VirtualPet.caloriesPerSecond;
  trace(getName( ) + "digested some food. It now has " + currentCalories + "calories remaining.");
    }
}
 
  public function getAge ( ) {
  var currentTime = new Date ( );
  var age = currentTime.time - creationTime.time;
  return age;
  }
 }
}


orcpochta 22.05.2010 01:15

Код AS3:

private function digest(e:TimerEvent):void
{
        if (currentCalories - VirtualPet.caloriesPerSecond <= 0)
        {
                trace (getName( ) + " has died.");
                e.target.stop( );
                      e.target.removeEventListener(e.TimerEvent, digest); //отписываем обработчик
        }
        else
        {
                currentCalories -= VirtualPet.caloriesPerSecond;
                trace(getName( ) + "digested some food. It now has " + currentCalories + "calories remaining.");
        }
}

И, кстати, из Мука все примеры поддерживаются))) Это если вы про setInterval( ).

TOKIO 22.05.2010 10:47

Цитата:

Сообщение от orcpochta (Сообщение 910084)
Код AS3:

private function digest(e:TimerEvent):void
{
        if (currentCalories - VirtualPet.caloriesPerSecond <= 0)
        {
                trace (getName( ) + " has died.");
                e.target.stop( );
                      e.target.removeEventListener(e.TimerEvent, digest); //отписываем обработчик
        }
        else
        {
                currentCalories -= VirtualPet.caloriesPerSecond;
                trace(getName( ) + "digested some food. It now has " + currentCalories + "calories remaining.");
        }
}

И, кстати, из Мука все примеры поддерживаются))) Это если вы про setInterval( ).

К сожалению код не помог, немного помогло вытаскивание переменной digestIntervalID из конструктора:

Код AS3:

private var digestIntervalID:Timer;
 
    public function VirtualPet (name) {
      setName(name);
          var digestIntervalID = new Timer(1000, 0);
          digestIntervalID.addEventListener(TimerEvent.TIMER, digest);
          digestIntervalID.start( );
    }

Хотя теперь когда выполняется но когда выполняется

Код AS3:

currentCalories - VirtualPet.caloriesPerSecond <= 0

в окне Вывод появляется:

Stan has died.
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at VirtualPet/digest()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()


PS У меня setInterval( ) CS4 не компилирует и выдает ошибку.

orcpochta 22.05.2010 11:38

Ыыы... ночью писал - лажу написал)))

Код AS3:

private function digest(e:TimerEvent):void
{
        if (currentCalories - VirtualPet.caloriesPerSecond <= 0)
        {
                trace (getName( ) + " has died.");
                e.target.stop( );
                      e.target.removeEventListener(TimerEvent.TIMER, digest); //тут была лажа - что касается таймера, то теперь вроде все ок
        }
        else
        {
                currentCalories -= VirtualPet.caloriesPerSecond;
                trace(getName( ) + "digested some food. It now has " + currentCalories + "calories remaining.");
        }
}


TOKIO 24.05.2010 18:18

Цитата:

Сообщение от orcpochta (Сообщение 910114)
Ыыы... ночью писал - лажу написал)))

Код AS3:

private function digest(e:TimerEvent):void
{
        if (currentCalories - VirtualPet.caloriesPerSecond <= 0)
        {
                trace (getName( ) + " has died.");
                e.target.stop( );
                      e.target.removeEventListener(TimerEvent.TIMER, digest); //тут была лажа - что касается таймера, то теперь вроде все ок
        }
        else
        {
                currentCalories -= VirtualPet.caloriesPerSecond;
                trace(getName( ) + "digested some food. It now has " + currentCalories + "calories remaining.");
        }
}


Спс, этот код работает! Можно небольшие пояснения по поводу:
1. почему в вашем коде не используется созданная в конструкторе переменная digestIntervalID?
2. зачем после e.target.stop( ) еще и событие удалять?

CrazyFlasher 24.05.2010 18:27

Цитата:

2. зачем после e.target.stop( ) еще и событие удалять?
а зачем им засорять память?

orcpochta 24.05.2010 18:30

1. Потому, что в такой реализации эту переменную видно только в самом конструкторе. Чтобы ее было видно в других методах, ее надо объявить в теле класса, а не в конструкторе, тогда ее можно будет использовать для идентификации нашего таймера. Но можно этого не делать, т.к., когда таймер отправляет событийный объект (у меня "e" - от слова event), который передается в приемник digest, то этот событийный объект "e" содержит ссылку на таймер, который его отправил (e.target - ссылка на таймер).
2. Когда вы подписываетесь на какое-то событие, слушатель висит в памяти, если не отписываться от них, то в емком приложении с течением времени могут возникнуть проблемы с памятью, отсюда проблемы с производительностью. Там еще много чего плохого от забытых в памяти слушателей может случиться - Мук это все хорошо описывает в своей книге.

TOKIO 24.05.2010 18:51

Спасибо, всё очень доходчиво. Мук в процессе.


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

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