Как сделать индикатор выполнения, который показывает процент загрузки файла, если Actionscript не поддерживает потоки? - PullRequest
0 голосов
/ 06 июня 2011

Так как Flash не поддерживает многопоточность, как это сделать в ActionScript 3?

1 Ответ

6 голосов
/ 06 июня 2011

Краткий ответ - добавив прослушиватель событий, чтобы сделать это асинхронно.

Длинный ответ заключается в том, что это довольно просто - если вы сделали это один раз, вы сделали это миллион раз:

var site_loader:Loader;
var your_text_field:TextField;

init();
start_load();

function init():void
{
    site_loader = new Loader();
    this.addChild(site_loader);

    your_text_field = new TextField();
    this.addChild(your_text_field);
}

function start_load():void
{
    site_loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, update_progress_text);
    site_loader.addEventListener(Event.COMPLETE, start_site);
    site_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, load_error);

    var url_path:String = "path/to/content.swf";
    var url_request:URLRequest = new URLRequest(url_path);  

    site_loader.load(url_request);
}

function update_progress_text(event:ProgressEvent):void
{
    var site_loader_progress:int = 100 * event.bytesLoaded / event.bytesTotal;
    your_text_field.text = site_loader_progress + " %";
}

function start_site(event:Event):void
{
    site_loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, update_progress_text);
    site_loader.removeEventListener(Event.COMPLETE, start_site);
    site_loader.removeEventListener(IOErrorEvent.IO_ERROR, load_error);
}

В основном виртуальная машина ActionScript запускается в цикле «События отправки, События процесса, Визуализация графики»; каждому кадру, событиям дается временной интервал, и каждое событие «по существу» запускается как поток (будет) в однопроцессорной системе.

Хотя ActionScript не является многопоточным, он опирается на очень привлекательную архитектуру, управляемую событиями, которая во многих случаях является лучшей альтернативой потокам (см. Эту статью здесь: http://www.stanford.edu/class/cs240/readings/threads-bad-usenix96.pdf).

При этом, надеюсь, что будущие версии AVM будут иметь явную поддержку нескольких потоков, хотя бы для того, чтобы лучше использовать почти повсеместные многопроцессорные системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...