由于Flash不支持多线程,你在actionscript 3中怎么做?
答案 0 :(得分:6)
简短的回答是 - 通过添加一个事件监听器来异步执行它。
答案很简单,这很简单 - 如果你已经完成了一次,你已经完成了一百万次:
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虚拟机基本上是在“Dispatch Events,Process Events,Render Graphics”循环中运行的;每个帧,事件都给出一个时间片,每个事件“基本上”作为一个线程(将在单处理器系统中)运行。
虽然ActionScript不是多线程的,但它确实依赖于非常性感的事件驱动架构,在许多情况下它是线程的更好替代方案(请参阅此文章:http://www.stanford.edu/class/cs240/readings/threads-bad-usenix96.pdf)。
话虽如此,希望未来版本的AVM能够明确支持多线程,只是为了更好地利用几乎无处不在的多处理器系统。