如果actionscript不支持线程,如何制作一个显示文件上传百分比的进度条?

时间:2011-06-05 20:55:15

标签: flash actionscript

由于Flash不支持多线程,你在actionscript 3中怎么做?

1 个答案:

答案 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能够明确支持多线程,只是为了更好地利用几乎无处不在的多处理器系统。