|
查看: 4145|回复: 0
|
flex as3 基于多线程的实现
[复制链接]
|
|
|
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>
<mx abel id = "l1" text="a{this.total1}"/>
<mx abel id = "l2" text="b{this.total2}"/>
<mx abel 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)。 |
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|