佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 4146|回复: 0

flex as3 基于多线程的实现

[复制链接]
发表于 28-8-2008 07:11 PM | 显示全部楼层 |阅读模式
flex 3,as3 是不具有多线程操作的能力,要入将后台平衡后台工作和UI界面呢 ?
目前 AS3的难题是只要后台处理超过一定的限度,那么必定会影响UI。例如,不能够刷新等等。

目前写了一个虚拟的多线程程序,希望可以解决某些问题。
//Save in /mt/multi.as
package mt{
        import flash.utils.*;
       
        import mx.utils.UIDUtil;
        public class multi{
                private static var interval:Number = 42;
                private static var maxrun:Number = 200;
                private static var threadid:Number = 0;
                private static var threadlist:Array = new Array();
                private var currenlist:Array = new Array();
                private static var sudothreadid:Number = -1;
                private static var curno:Number = 0;
                private static var isstop:Boolean = false;
                private static var registerlist:Array = new Array();
                private var len:Number = -1;
                private var uid:String = "";
                private static var multex:Boolean = false;
               
                public function multi(){
                        uid = UIDUtil.createUID();                       
                }
               
                public function addthread(func:Function,params:Array = null):Number{
                        var threadboard:Array = new Array();
                        threadboard["uid"] = uid;
                        threadboard["func"] = func;
                        threadboard["params"] = params;
                        threadboard["status"] = 0; //0 ready, 2 suspended, 4 dead
                        currenlist.push(threadboard);
                        len++;
                        return len;
                }
               
                public function removethread(id:Number):void{
                        var len:Number = multi.threadlist.length;
                        for (var i:Number = 0;i<len;i++){
                                if (multi.threadlist["uid"]==uid){
                                        multi.threadlist["status"] = 4;
                                }
                        }
                }
               
                public function start():void{
                        if (multi.multex==true){
                                setTimeout(start,100);
                        }
                        multi.curno = 0;
                        multi.multex=true;
                        multi.stop();
                        insertthread();
                        multi.runthread();
                        registerlist[uid] = 0;//0 ready, 2 suspended, 4 dead
                        multi.multex=false;
                }
               
                private function insertthread():void{
                        var temp:Array = new Array();
                        var tlen:Number = multi.threadlist.length;
                        var clen:Number = currenlist.length;
                        var i:Number = 0;
                        var ctemp:Array = currenlist;
                       
                        if (clen < tlen){
                                var scale:int = Math.round(tlen/clen);
                                for (i=0;i<tlen;i++){
                                        temp.push(multi.threadlist);
                                        if (i%scale ==0 && ctemp.length>0){
                                                temp.push(ctemp.shift());
                                        }
                                }
                        }
                        else{
                                for (i=0;i<tlen;i++){
                                        temp.push(multi.threadlist);
                                        temp.push(currenlist);
                                }
                               
                                for (i=tlen;i<clen;i++){
                                        temp.push(currenlist);
                                }
                        }
                        multi.threadlist = temp;
                }
               
                public static function stop():void{
                        isstop = true;
                        clearTimeout(multi.sudothreadid);
                }
               
                public static function runthread():void{
                        multi.stop();
                        multi.isstop = false;
                        var len:Number = multi.threadlist.length;
                        var j:Number = 0;
                        var i:Number = 0;
                        var temp:Array = new Array();
                       
                       
                        if (multi.curno == (Number.MAX_VALUE -1)){
                                if (multi.isstop == true){
                                        return;
                                }                               
                                for (i = 0;i<len;i++,j++){
                                        if (multi.threadlist["status"] != 4){
                                                temp.push(multi.threadlist);
                                        }
                                }
                                multi.curno = 0;
                                multi.threadlist = temp;
                                temp = new Array();
                        }
                       
                        for (var i:Number = multi.curno;i<len;i++){
                                if (multi.isstop == true){
                                        return;
                                }

                                if (j>=multi.maxrun){
                                        multi.stop();
                                        multi.sudothreadid = setTimeout(multi.runthread,multi.interval);
                                        return;
                                }                               
                                if ((multi.threadlist!=null) && (multi.threadlist["status"]==0) && multi.registerlist[multi.threadlist["uid"]]==0){
                                        if (multi.threadlist["params"]!=null){
                                                multi.threadlist["func"](multi.threadlist["params"]);
                                        }
                                        else{
                                                multi.threadlist["func"]();
                                        }
                                        multi.threadlist["status"] = 4;
                                        j++;
                                }
                                multi.curno++;
                        }
                       
                       
                        var hasnotfinishthread:Number = 0;
                        for (i = 0;i<len;i++){
                                if (multi.threadlist["status"] != 4){
                                        temp.push(multi.threadlist);
                                }
                               
                                if (multi.threadlist["status"] == 0){
                                        hasnotfinishthread++;
                                }
                        }
                        multi.threadlist = temp;
                        if (hasnotfinishthread>0){
                                multi.stop();
                                multi.sudothreadid = setTimeout(multi.runthread,multi.interval);
                        }
                        multi.curno = 0;
                }

                public function suspendthread():void{
                        multi.registerlist[uid] = 2;
                }
               
                public function resumethread():void{
                        var temp:Array = new Array();
                        var temp2:Array = new Array();
                        var tlen:Number = multi.threadlist.length;
                       
                        var i:Number = 0;
                        var ctemp:Array = new Array();
                        multi.stop();                       
                       
                        for (i=0;i<tlen;i++){
                                if (multi.threadlist["status"]!=4){
                                        if (multi.threadlist["uid"]==uid){
                                                ctemp.push(multi.threadlist);
                                        }
                                        else{
                                                temp2.push(multi.threadlist);
                                        }                                       
                                }
                        }
                        multi.threadlist = temp2;
                        tlen = multi.threadlist.length;
                        var clen:Number = ctemp.length;
                        if (clen < tlen){
                                var scale:int = Math.round(tlen/clen);
                                for (i=0;i<tlen;i++){
                                        if (multi.threadlist["status"]!=4){
                                                temp.push(multi.threadlist);
                                        }
                                        if (i%scale ==0 && ctemp.length>0){
                                                temp.push(ctemp.shift());
                                        }
                                }
                        }
                        else{
                                for (i=0;i<tlen;i++){
                                        if (multi.threadlist["status"]!=4){
                                                temp.push(multi.threadlist);
                                        }
                                        temp.push(ctemp);
                                }
                               
                                for (i=tlen;i<clen;i++){
                                        temp.push(ctemp);
                                }
                        }
                        multi.threadlist = temp;                       
                        multi.registerlist[uid] = 0;
                        multi.curno = 0;
                        multi.runthread();
                }
        }
}

//Save as abc.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
        xmlns:mx="http://www.adobe.com/2006/mxml"
       
        layout="absolute"
         
        creationComplete="kkk()">
        <mx:VBox>
                <mx:HBox>
                        <mxabel id = "l1" text="a{this.total1}"/>
                        <mxabel id = "l2" text="b{this.total2}"/>
                        <mxabel id = "l3" text="c{this.total3}"/>
                </mx:HBox>

        </mx:VBox>

        <mx:Script>
                <![CDATA[
                        import mx.controls.Alert;
                        import mt.multi;
                        import flash.utils.*
                        public var mlt:multi;
                        public var mlt1:multi;
                        public var mlt2:multi;
                       
                        [Bindable]                       
                        public var total1:Number = 0;
                        [Bindable]
                        public var total2:Number = 0;
                        [Bindable]
                        public var total3:Number = 0;
                       
                        public var m1:Number = 100000;
                        public var m2:Number = 50000;
                        public var m3:Number = 20000;
                                               
                        public function kkk():void{
                                //var uf:multi = new multi();
                                this.frameRate
                                mlt = new multi();
                                for (var i:int = 0;i<m1;i++){
                                        mlt.addthread(spt);
                                }
                               
                                mlt1 = new multi();
                                for (var i:int = 0;i<m2;i++){
                                        mlt1.addthread(spt1);
                                }
                               
                                mlt2 = new multi();
                                for (var i:int = 0;i<m3;i++){
                                        mlt2.addthread(spt2);
                                }
                               
                                setTimeout(run,2000);
                                //setTimeout(suspend,5000,mlt1);
                        }
                       
                        public function suspend(thd:multi):void{
                                Alert.show("suspend!","";
                                thd.suspendthread();
                                setTimeout(resume,5000,thd);
                        }
                       
                        public function resume(thd:multi):void{
                                thd.resumethread();
                        }                       
                       
                        public function run():void{
                                mlt2.start();
                                mlt1.start();
                                mlt.start();
                        }
                       
                        public function spt():Array{
                                var u:String = ttt();
                                total1++;
                                //if (total1==m1){
                                        //trace ("a" + total1);
                                //}
                               
                                return u.split("|";
                               
                        }
                       
                        public function spt1():Array{
                                var u:String = ttt();
                                total2++;
                                //if (total2==m2){
                                        //trace ("b" + total2);
                                //}
                               
                                return u.split("|";
                        }                       
                       
                        public function spt2():Array{
                                var u:String = ttt();
                                total3++;
                                //if (total3 == m3){
                                        //trace ("c" + total3);
                                //}
                                return u.split("|";
                        }                       
                       
                        public function ttt():String{
                                var u:String = "aa";
                                var p:Array = new Array();
                                for (var i:int = 0;i<50;i++){
                                        p.push(u);
                                }
                                return p.join("|";
                        }
                ]]>
        </mx:Script>
</mx:Application>
使用flex 3 compile 后就能够测试了。主要是为了测试cpu平衡(防止CPU 100% usage)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 23-12-2025 10:59 AM , Processed in 0.110040 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表