Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 17.11.2011, 21:10
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 1  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
По умолчанию Аналог функции sleep()

Здравствуйте, товарищи. Возникла потребность запускать функцию через некоторые промежутки времени, если выполняется некое условие. Приведу код, ибо он яснее словесной тирады:
Код AS3:
function someFunc(event:TimerEvent = null):void {
    // Наличие параметра говорит о том, что функция была вызвана после
    // ожидания, запущенного из этой же функции.
    if (event) event.target.removeEventListener(TimerEvent.TIMER_COMPLETE, someFunc);
    // то есть нормальный вызов функции происходит так: someFunc();
 
    if (<некое условие>) {
        // Если условие истинно, перезапускаем функцию через 1 секунду.
        var timer:Timer = new Timer(1000, 1);
        timer.addEventListener(TimerEvent.TIMER_COMPLETE, someFunc);
        timer.start();
        return;
    }
    // иначе, если <некое условие> оказалось ложным,
    // выполняем дальнейший код функции.
}
Интересует, нет ли здесь утечек памяти (например не нужно ли явно вызывать (event.target as Timer).reset())? То есть, насколько я понимаю, timer живет до тех пор, пока тикает и пока имеет слушателя события. Если так, то первая строчка функции должна сделать его доступным для GC. Также буду благодарен за возможные альтернативные решения.

Старый 17.11.2011, 21:16
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 2  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Интересует, нет ли здесь утечек памяти
Нет. Утечек тут не будет. Но переменную таймера я бы все-таки сделал на уровне класса

Старый 17.11.2011, 22:39
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 3  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Хм... А я бы сделал Java-style глобальный таймер и уже на него бы вешал задания по вызову функций. То есть вместо нескольких таймеров будет один ENTER_FRAME, который будет проверять задания в очереди и запускать те из них, чье время пришло. То есть 3 вещи:
1) Реализация паттерна "команда" в виде функции, параметров и даты запуска
2) Очередь из этих команд (связный список, чтобы было удобно хранить в отсортированном виде)
3) Таймер, который бы бегал по очереди и вызывал нужные задания
__________________
...вселенская грусть

Старый 17.11.2011, 22:49
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 4  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Утечки будут.

Старый 18.11.2011, 00:14
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 5  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Тигра, а ты тему читал?
__________________
...вселенская грусть

Старый 18.11.2011, 00:29
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 6  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
То есть, насколько я понимаю, timer живет до тех пор, пока тикает и пока имеет слушателя события
По идее, зависит от реализации флешплеера, теоретически его может снести и до того, как закончит тикать - ссылок то на него нет, он только сам на слушатели ссылается. Дисплей-объект, например, рассылающий ENTER_FRAME, может спокойно кануть в лету послав десяток-другой событий.
Однако:
Цитата:
Timer против GC.
Запись от dimarik размещена 21.02.2011 в 21:41
Обновил(-а) dimarik 13.03.2011 в 21:29
Все просто. Пока тикает экземпляр Timer, он не может быть удален сборщиком мусора (Garbage Collector).
Ну а насчёт утечек - если бы до таймера не добирался GC даже при его неактивности - это была бы принципиальная проблема flashplayer'а. Т.е. никаким боком нельзя было бы убрать ненужные таймеры.

С другой стороны, если вы пользуетесь одним таймером, а не создаете по 5 штук в секунду - конечно это будет лучше для производительности - ни память каждый раз выделять не надо, ни gc сильно не напрягается (вопрос только в том, сколько будет жрать чудная система в стиле, предложенном gloomyBrain, зато отписаться можно будет от ставшей ненужной комманды)

P.S. Связный список, он ведь тоже подразумевает создание объекта - узла списка при добавлении элемента, а время поиска произвольного узла перед тем как удалить - явно не быстрее чем в массиве. Можно, конечно навернуть словарик соответствия узел-елемент, тогда время доступа зависеть от количества элементов не будет. Но если элементы повторяются... Скорость доступа замедляется на время вызова функции (тут вам не haXe с inline-ами). Короче без тестов производительности я бы это дело не рискнул встраивать - обошелся бы обычным массивом

P.S.2 Самый эффективный способ - это когда список организуется с самими хранимыми элементами в качестве узлов - тогда создавать ничего не надо - элементы уже созданы, просто на них навешаны prev и next поля. Только теперь элемент не может храниться в 2-х списках одновременно. Плюс т.к. поле не может быть частью переменной - интерфейс элемента списка использовать нельзя - только наследование или узкозаточенный список под конкретные элементы.


Последний раз редактировалось expl; 18.11.2011 в 00:48.
Старый 18.11.2011, 00:33
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 7  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Из того, что bav подписывается на TIMER_COMPLETE, можно сделать вывод - таймер уже не тикает. Следовательно, данная причина утечек не рассматривается. Таймер создается локально, значит и вторая причина - не причина.
__________________
...вселенская грусть

Старый 18.11.2011, 00:42
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 8  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Фу, минус мне. Не увидел, что tick = 1. Потому что я пил, дура! (с)
У меня вот есть сниппет.
Код AS3:
if (event) (event.currentTarget as IEventDispatcher).removeEventListener(event.type, arguments.callee);
Если отписаться надо - всегда его использую. Даже если поле класса есть и метод вполне себе определен. Потому что время экономит.
Пойду ещё виски налью, что-то я в разнос.

Старый 18.11.2011, 01:19
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 9  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
время поиска произвольного узла перед тем как удалить - явно не быстрее чем в массиве
А зачем тебе может понадобиться произвольный узел? Вероятнее всего, он нужны будут именно по порядку.
Цитата:
Плюс т.к. поле не может быть частью переменной
Вот это я не очень понял.
__________________
...вселенская грусть

Старый 18.11.2011, 01:46
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 10  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Плюс т.к. поле не может быть частью переменной - это про то что нельзя запихнуть prev и next в интерфейс (а геттерами/сеттерами делать слишком накладно). Впринципе, обычно это не проблема.

Цитата:
А зачем тебе может понадобиться произвольный узел? Вероятнее всего, он нужны будут именно по порядку.
Это только если делать чистую очередь или стек.
Если очередь с приоритетом (например те же комманды по времени сортировать бинарной вставкой) - то потребуется. Или вытащить комманду, которая уже не нужна. В общем примеров достаточно.

Почему, кстати эту задачу Вы предлагаете решать списком?
У него же перед массивом только 2 преимущества - скорость вставки (если знаем соседний узел!) и удаления (если знаем узел!) не зависит от количества элементов. Но чтобы это было действительно быстрее надо ряд условий соблюсти.
(Просто видел реализации вещей в виде списка, мотивация использования списков в которых непонятна,
может есть еще какие-то преимущества, или я не правильно что-то оцениваю?)

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:33.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
sleep

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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