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

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

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

Регистрация: Oct 2012
Адрес: Hamburg
Сообщений: 22
По умолчанию command pooling примеры в as3 фреймворке?

Здравствуйте,

Может быть, вы знаете хороший пример command pooling реализации в каком-нибудь as3 фреймворке??

Я пытаюсь добавить эту функцию в mvcExpress... интересно, как это сделанна в других местах.

Я думаю необходимы эти требования:


- Command pooling is automatically activated by extending special command. (PooledCommand.as)
- user must have functions to disable/enable pooling on command. (for asynchronous execution)
- Command must be automatically removed from the pool if any of it's dependencies are changed/removed.
- Framework must have a function to clear command pool.
- OPTIONAL : automatically remove command from the pool after set time interval.


Я думаю, что command pooling необходим в уровне фреймворкa.

Каково ваше мнение?

Старый 28.10.2012, 22:44
terbooter вне форума Посмотреть профиль Отправить личное сообщение для terbooter Найти все сообщения от terbooter
  № 2  
Ответить с цитированием
terbooter

Регистрация: Oct 2006
Адрес: Novosibirsk-Kaliningrad
Сообщений: 1,278
Отправить сообщение для terbooter с помощью ICQ Отправить сообщение для terbooter с помощью Skype™
Присоединяюсь. Тоже хочется посмотреть на реализацию пула команд.

Старый 29.10.2012, 12:08
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 3  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
А что вы подразумеваете под "command pooling"? Отправка команд пачкой на сервер или что-то еще? От этого будут зависеть ответы на все остальные ваши вопросы.

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Вообще требования странноватые, на мой взгляд.
Цитата:
user must have functions to disable/enable pooling on command. (for asynchronous execution)
Каким образом пул связан с асинхронностью? Понятное дело, что пока экземпляр используется, из пула его получить нельзя.

Цитата:
Command must be automatically removed from the pool if any of it's dependencies are changed/removed.
В моем понимании, команда может порождать другую команду, других зависимостей быть у нее не должно. Если мы считаем, что все команды берутся из пула - то очевидно что это требование излишне, слежение за жизненным циклом всех команд производится отдельно от кода самих команд.

Цитата:
Framework must have a function to clear command pool
зачем? =) Неужто команды (которые не должны хранить ни данных, ни состояния, ни ссылок) вдруг стали давать критическую массу в оперативной памяти?

Цитата:
OPTIONAL : automatically remove command from the pool after set time interval
Это тоже для меня загадка. Команда либо активна в данный момент, либо лежит в пуле и ждет, пока ее сделают активной. И так по кругу. Руками удалять ее из пула нет смысла, ИМО.

PS
Вообще, в плане эксперимента, у меня получилась вот такая конструкция. Не претендую на истину в последней инстанции, но вроде бы подходит под определение "пулинг команд":
Код AS3:
package
{
    import flash.utils.Dictionary;
    import flash.utils.describeType;
    import flash.utils.getQualifiedClassName;
 
    /**
     * Global command runner
     */
    public class Command
    {
        public function Command()
        {
            super();
        }
 
        private static const _classList:Dictionary = new Dictionary();
 
        public static function run(commandClass:Class, ...args):void
        {
            if (!commandClass) throw new ArgumentError("Parameter must be not-null!");
            if (!(commandClass in _classList))
            {
                var className:String = getQualifiedClassName(Command);
                var description = describeType(commandClass);
                var isInheritedCommand:Boolean = Boolean(description..extendsClass.(@type == className));
 
                if (!isInheritedCommand) throw new Error("Only Command-inherited classes are allowed!");
 
                _classList[commandClass] = new Array();
            }
 
            var pool:Array = _classList[commandClass] as Array;
            var command:Command = (pool.length ? pool.pop() : new commandClass()) as Command;
 
            command._pool = pool;
            command.run.apply(command, args);
        }
 
        private var _pool:Array;
 
        /**
         * Call this method to return this command instance to associated pool
         */
        protected final function finalize():void
        {
            _pool.push(this);
        }
 
        /**
         * Run command with specified arguments
         */
        protected function run(...args):void
        {
            throw new Error("Methot-override is supposed here!");
        }
 
    }
}
Что нам нужно делать, так это:
- отнаследоваться от этого класса
- оверрайдить метод run
- внутри метода run (или где-то еще, если команда асинхронная) не забыть вызвать finalize()

Запускать всегда через
Код AS3:
Command.run(CommandExample, "hello, world!")

Да, единственное, что придется еще дописать - это свою реализацию IEventDispatcher, унаследованную от класса Command. Но, думаю, за этим дело не станет =)
__________________
...вселенская грусть


Последний раз редактировалось gloomyBrain; 29.10.2012 в 13:50.
Старый 29.10.2012, 15:52
Deril_AS3 вне форума Посмотреть профиль Отправить личное сообщение для Deril_AS3 Найти все сообщения от Deril_AS3
  № 5  
Ответить с цитированием
Deril_AS3
 
Аватар для Deril_AS3

Регистрация: Oct 2012
Адрес: Hamburg
Сообщений: 22
Цитата:
Сообщение от maxkar Посмотреть сообщение
А что вы подразумеваете под "command pooling"? ...
фреймвори (PureMVC, RobotLegs, mvcExpress) application logic идет в "Commnad" классы.

Я хочу иметь автоматический pooling для них.

Добавлено через 57 минут
Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
Каким образом пул связан с асинхронностью?
Я имею в виду автоматическое Command pooling.

сценарий:
  1. command execute is triggered. (reacts to message or executed directly)
  2. get/create command from pool.
  3. execute()
    1. ---start command---
    2. <do your stuff>
    3. ---end command---
  4. push command to pool.

Пользователь контролирует только <do your stuff>. Все остальное делает фреймворк.

сценарий с асинхронностью :
  1. command execute is triggered. (reacts to message or executed directly)
  2. get/create command from pool.
  3. execute()
    1. ---start command---
    2. <do your stuff>
    3. lock()
  4. not push command to pool - it is locked.
  5. ...
    1. ---asynchronous command function ---
    2. <do your stuff>
    3. unlock()
    4. ---end command---
  6. push command to pool - it is not locked.

Можно использовать finalize().

что лучше?
  • Force user use finalize() in all commands.
  • finalize all commands automatically, unless user optionally locks it. (for Asynchronous commands)


Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
...других зависимостей быть у нее не должно...
Я имею в виду Proxy зависимости.

Код AS3:
package {
public class TestCommand extends Command {
 
	[Inject]
	public var proxyDependency:TestProxy;
 
	public function execute(blank:Object):void{
		//...
	}
 
}
}
если proxyDependency удаляется - pooled TestCommand должны быть удалены.




Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
Руками удалять ее из пула нет смысла, ИМО
Я не уверен в этом.

Я могу представить себе сценарий, при котором в течение некоторого времени вы используете те же команды много .. после этого вам не нужны эти команды. (можно очистить pool).

Это дополнительные функции.


спасибо за пример!
Я избегаю static классов, но использовать finalize() - интересная идея.

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Класс можно сделать и не статичным, просто, на мой взгляд, так удобнее запускать из любого места. Да и делать как-то иначе == писать больше кода. На счет lock/unlock - не совсем очевидно получается. Что будет если вызвать unlock до того как был вызван lock? В предолагаемом мной подходе есть 2 основные мысли:
1) optional pooling
2) контроль над использованием команд вне пула.

Правда, второй пункт в пример не попал =) Доработанынй вариант выглядит так:
Код AS3:
package
{
    import flash.utils.Dictionary;
    import flash.utils.describeType;
    import flash.utils.getQualifiedClassName;
 
    /**
     * Global command runner
     */
    public class Command
    {
        public function Command()
        {
            super();
        }
 
        private static const _classList:Dictionary = new Dictionary();
 
        public static function run(commandClass:Class, ...args):void
        {
            if (!commandClass) throw new ArgumentError("Parameter must be not-null!");
            if (!(commandClass in _classList))
            {
                var className:String = getQualifiedClassName(Command);
                var description = describeType(commandClass);
                var isInheritedCommand:Boolean = Boolean(description..extendsClass.(@type == className));
 
                if (!isInheritedCommand) throw new Error("Only Command-inherited classes are allowed!");
 
                _classList[commandClass] = new Array();
            }
 
            var pool:Array = _classList[commandClass] as Array;
            var command:Command = (pool.length ? pool.pop() : new commandClass()) as Command;
 
            command._pool = pool;
            command._finalized = false;
            command.start(args);
        }
 
        private var _pool:Array;
        private var _finalized:Boolean;
 
        private function start(args:Array):void
        {
            if (_finalized) throw new Error("Unable to run finalized command!");
            this.run.apply(this, args);
        }
 
        /**
         * Call this method to return this command instance to associated pool
         */
        protected final function finalize():void
        {
            if (_finalized) throw new Error("Command already is finalized!");
            _finalized = true;
            _pool.push(this);
        }
 
        /**
         * Run command with specified arguments
         */
        protected function run(...args):void
        {
            throw new Error("Methot-override is supposed here!");
        }
 
    }
}
__________________
...вселенская грусть

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

Регистрация: Oct 2012
Адрес: Hamburg
Сообщений: 22
Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
Класс можно сделать и не статичным, просто, на мой взгляд, так удобнее запускать из любого места.
это правда. Но мы не делаем все для удобства, или скорости.
Некоторые вещи делаются, чтобы сохранить контроль и ремонтопригодность.

Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
Что будет если вызвать unlock до того как был вызван lock?
Silent fail, warning trace или Error throw... (еще думаю, что лучше.) Мне нравится Errors...



Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
2) контроль над использованием команд вне пула.
Что вы имеете в виду? какой контроль?

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

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

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

Регистрация: Oct 2012
Адрес: Hamburg
Сообщений: 22
Я сделал command pooling прототип: https://github.com/MindScriptAct/mvc...ee/release_1.3

Результат выглядит хорошо!

Тест для сравнения - сценарий:

- send a message
- execute command with dependencies
- command updates proxy
- proxy send data change message
- mediator handles data change massage.

результат: Сколько действий вы можете сделать в 1 миллисекунду.

RobetLegs 1 dependency - 46 runs/1ms
PureMvc cammand 1 dependency - 113 runs/1ms
mvcExpress command 1 dependency, No pooling - 375 runs/1ms
mvcExpress command 1 dependency, With pooling - 472 runs/1ms

mvcExpress cammand 5 dependencies, No pooling - 227 runs/1ms
mvcExpress cammand 5 dependencies, With pooling - 457 runs/1ms


Мне еще нужно проверить, как command pool тормозит всю систему... Но результаты выглядят хорошо!

как это использовать: вместо extend Command - использовать PooledCommand!

Код AS3:
package com.mindScriptAct.mvcExpressSpeedTest.controller {
...
public class TestCommand extends PooledCommand {
 
	[Inject]
	public var testProxy:TestProxy;
 
	public function execute(params:Object):void {
		testProxy.doStuff();
	}
 
}
}
Asynchronous command:

Код AS3:
package com.mindScriptAct.mvcExpressSpeedTest.controller {
...
public class TestCommand extends PooledCommand {
 
	[Inject]
	public var testProxy:TestProxy;
 
	public function execute(blank:Object):void {
		lock(); // diasble autamatic pooling.
		var imageLoader:Loader = new Loader();
		imageLoader.addEventListener(Event.COMPLETE, handleImmageLoad);
		imageLoader.load(new URLRequest("example.jpg"));
 
	}
 
	private function handleImmageLoad(event:Event):void {
		// do stuff...
		unlock(); // pool command.
	}
 
}
}

Старый 31.10.2012, 01:48
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 10  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
http://www.as3commons.org/as3-common...roduction.html
__________________
Отряд Котовскага

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

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

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


 


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


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