![]() |
Аналог функции sleep()
Здравствуйте, товарищи. Возникла потребность запускать функцию через некоторые промежутки времени, если выполняется некое условие. Приведу код, ибо он яснее словесной тирады:
Код AS3:
|
Цитата:
|
Хм... А я бы сделал Java-style глобальный таймер и уже на него бы вешал задания по вызову функций. То есть вместо нескольких таймеров будет один ENTER_FRAME, который будет проверять задания в очереди и запускать те из них, чье время пришло. То есть 3 вещи:
1) Реализация паттерна "команда" в виде функции, параметров и даты запуска 2) Очередь из этих команд (связный список, чтобы было удобно хранить в отсортированном виде) 3) Таймер, который бы бегал по очереди и вызывал нужные задания |
|
Тигра, а ты тему читал?
|
Цитата:
Однако: Цитата:
С другой стороны, если вы пользуетесь одним таймером, а не создаете по 5 штук в секунду - конечно это будет лучше для производительности - ни память каждый раз выделять не надо, ни gc сильно не напрягается (вопрос только в том, сколько будет жрать чудная система в стиле, предложенном gloomyBrain, зато отписаться можно будет от ставшей ненужной комманды) P.S. Связный список, он ведь тоже подразумевает создание объекта - узла списка при добавлении элемента, а время поиска произвольного узла перед тем как удалить - явно не быстрее чем в массиве. Можно, конечно навернуть словарик соответствия узел-елемент, тогда время доступа зависеть от количества элементов не будет. Но если элементы повторяются... Скорость доступа замедляется на время вызова функции (тут вам не haXe с inline-ами). Короче без тестов производительности я бы это дело не рискнул встраивать - обошелся бы обычным массивом P.S.2 Самый эффективный способ - это когда список организуется с самими хранимыми элементами в качестве узлов - тогда создавать ничего не надо - элементы уже созданы, просто на них навешаны prev и next поля. Только теперь элемент не может храниться в 2-х списках одновременно. Плюс т.к. поле не может быть частью переменной - интерфейс элемента списка использовать нельзя - только наследование или узкозаточенный список под конкретные элементы. |
Из того, что bav подписывается на TIMER_COMPLETE, можно сделать вывод - таймер уже не тикает. Следовательно, данная причина утечек не рассматривается. Таймер создается локально, значит и вторая причина - не причина.
|
Фу, минус мне. Не увидел, что tick = 1. Потому что я пил, дура! (с)
У меня вот есть сниппет. Код AS3:
Пойду ещё виски налью, что-то я в разнос. |
Цитата:
Цитата:
|
Плюс т.к. поле не может быть частью переменной - это про то что нельзя запихнуть prev и next в интерфейс (а геттерами/сеттерами делать слишком накладно). Впринципе, обычно это не проблема.
Цитата:
Если очередь с приоритетом (например те же комманды по времени сортировать бинарной вставкой) - то потребуется. Или вытащить комманду, которая уже не нужна. В общем примеров достаточно. Почему, кстати эту задачу Вы предлагаете решать списком? У него же перед массивом только 2 преимущества - скорость вставки (если знаем соседний узел!) и удаления (если знаем узел!) не зависит от количества элементов. Но чтобы это было действительно быстрее надо ряд условий соблюсти. (Просто видел реализации вещей в виде списка, мотивация использования списков в которых непонятна, может есть еще какие-то преимущества, или я не правильно что-то оцениваю?) |
| Часовой пояс GMT +4, время: 02:25. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.