...По крайней мере, в документации я на сей счет ничего вразумительного не обнаружил, а на вопрос из моей предыдущей заметки не смогли ответить даже на форуме Adobe. Таким образом, я пришел к выводу, что очередь нужно реализовывать самому.
Задача оказалась довольно простой.
Вот пример класса, реализующего очередь:
package ru.dmitrykrasnov.service.shader {
import flash.display.ShaderJob;
import flash.events.ShaderEvent;
public class ShaderJobQueue {
public static const INSTANCE:ShaderJobQueue = new ShaderJobQueue();
private var queue:Vector.<ShaderJob>;
private var inProgress:Boolean;
public function ShaderJobQueue() {
if (INSTANCE != null) throw new Error("Сonstructor is locked.");
queue = new Vector.<ShaderJob>();
}
public function addToQueue(shaderJob:ShaderJob):void {
queue.push(shaderJob);
if (!inProgress) {
inProgress = true;
run();
}
}
private function run():void {
var shaderJob:ShaderJob = queue.shift();
shaderJob.addEventListener(ShaderEvent.COMPLETE, shaderJobCompleteHandler);
shaderJob.start();
}
private function shaderJobCompleteHandler(event:ShaderEvent):void {
event.target.removeEventListener(ShaderEvent.COMPLETE, shaderJobCompleteHandler);
if (queue.length > 0) {
run();
} else {
inProgress = false;
}
}
}
}При необходимости, этот класс можно использовать самостоятельно, вставив в свой код строку:
ShaderJobQueue.INSTANCE.addToQueue(shaderJob);
Но это некрасиво. Эстетики ради, можно немного усовершенствовать класс ShaderJob:
package ru.dmitrykrasnov.service.shader {
import flash.display.Shader;
import flash.display.ShaderJob;
public class ShaderJobEnhanced extends ShaderJob{
private var addedToQueue:Boolean;
public function ShaderJobEnhanced(shader:Shader = null, target:Object = null, width:int = 0, height:int = 0) {
super(shader, target, width, height);
}
public override function start(waitForCompletion:Boolean = false):void {
if (waitForCompletion || addedToQueue) {
super.start(waitForCompletion);
} else {
addedToQueue = true;
ShaderJobQueue.INSTANCE.addToQueue(this);
}
}
}
}Тогда метод ShaderJobEnhanced.start() будет полностью соответствовать документации метода ShaderJob.start().
Честно говоря, сейчас я даже рад, что Adobe не предоставила готовую реализацию очереди т.к. у нас есть возможность сделать эту реализацию сколь угодно специфичной (например, сейчас мне нужна очередь с динамической сортировкой). Только надо было как-то более адекватно отразить это в документации.
У вас везде угольные скобки скушались:
ОтветитьУдалитьprivate var queue:Vector.;
queue = new Vector.();
Спасибо. Поправил вроде.
ОтветитьУдалитьБольшое спасибо за класс. Буду использовать!
ОтветитьУдалить