显示多线程下载进度的图形界面

Mr_MAO 6天前 235

使用thread.manage来管理多线程,使用plus来绘制下载的可视化界面。

//模拟多线程下载的可视化界面
import win.ui;
/*DSG{{*/
var winform = win.form(text="多线程下载的图形化界面";right=759;bottom=469;clipch=1)
winform.add(
btnPause={cls="button";text="暂停所有线程";left=16;top=88;right=160;bottom=133;dl=1;dt=1;z=2};
btnStart={cls="button";text="启动多线程下载";left=16;top=24;right=160;bottom=69;dl=1;dt=1;z=1};
btnStop={cls="button";text="停止所有线程";left=16;top=152;right=160;bottom=197;dl=1;dt=1;z=3};
plus={cls="plus";left=176;top=24;right=736;bottom=448;clipch=1;db=1;dl=1;dr=1;dt=1;edge=1;notify=1;repeat="center";z=4}
)
/*}}*/

//创建线程管理器
import thread.manage;       //导入线程管理器
manage = thread.manage(5)   //指定线程池的最大线程数,也可以为3

//以下模拟一个文件的大小,及映射为图像的宽高信息
var totalSize = 1000;//下载文件的总大小
var rowNum = 40;    
var colNum = totalSize / rowNum;    

import thread.table;            //导入线程表
var tt_finish = thread.table(); //用来标记完成状态
var tt_color = thread.table();  //用来存储填充颜色

//初始化线程表(每个cell的完成状态为0,颜色为wihte)
var ini_threadtables = function(){
    for(i=1; totalSize; 1){     
        tt_finish[i] = 0;
        tt_color[i] = 0x00FFFFFF;
    }
}

//这是模拟下载的函数 
//(@1、@2为线程表,@3..@7是界面线程传给线程表的数据)
//(arr1的实参为tt_finish;arr2的实参为tt_color)
var downloading = function(arr1,arr2,color,startNum,endNum,pieceSize){
    if(!endNum) endNum = startNum + pieceSize -1;  //自动截取分块大小 
    //修改线程表的数据
    for(i=startNum; endNum; 1){
        arr1[i] = 1;
        arr2[i]= color;
        sleep(math.random(50,300))
    } 
}

winform.btnStart.oncommand = function(id,event){
    if(manage.busy()==true) return;
    ini_threadtables();      iscancle = false;
    
    //创建5个线程任务,模拟执行下载任务
    var pieceSize = totalSize / 5 //设置每个线程下载的尺寸(将文件均分为5等分)
    manage.create(downloading, tt_finish, tt_color, 0xAAE080E0/*淡紫色*/, 1,, pieceSize)
    manage.create(downloading, tt_finish, tt_color, 0x8865C200/*草绿色*/, pieceSize+1,, pieceSize)
    manage.create(downloading, tt_finish, tt_color, 0xAAFFC212/*黄  色*/, pieceSize*2+1,, pieceSize)
    manage.create(downloading, tt_finish, tt_color, 0xAAFF4100/*洋红色*/, pieceSize*3+1,, pieceSize)
    manage.create(downloading, tt_finish, tt_color, 0xAABDB76B/*卡其色*/, pieceSize*4+1,, pieceSize)
    
    manage.waitClose() //等待所有线程结束
    if(not iscancle) win.msgbox("下载结束","提示")
}

winform.btnPause.oncommand = function(id,event){
    if(manage.busy()==false) return; 
    if(owner.text =="暂停所有线程"){
        manage.suspend();
        owner.text = "恢复所有线程"
    }else {
        manage.resume();
        owner.text = "暂停所有线程"
    }
}

winform.btnStop.oncommand = function(id,event){
    if(manage.busy()==false) return;  
    var handles = manage.getHandles(); 
    for(i=1;#handles;1){
        thread.terminate(handles[i],0) //停止线程
    }   
    iscancle = true;
    win.msgbox("下载已取消","提示")
    winform.btnPause.text = "暂停所有线程"
}

//画绿色格子线
winform.plus.onDrawBackground = function(graphics,rc,bkColor,foreColor){    
    var w, h = rc.width(),rc.height();
    var cell_w = w / rowNum;
    var cell_h = h / colNum;

    graphics.clear(0xFFFFFFFF) 
    var pen = gdip.pen( 0xFF00FF00/*绿色*/, 1, 2);
    for(i=cell_w; w; cell_w){
        graphics.drawLine(pen,i,0,i,h)
    }
    for(j=cell_h; h; cell_h){
        graphics.drawLine(pen,0,j,w,j)
    }
    return true; 
}

//画彩色小方块
winform.plus.onDrawContent = function(graphics,rc,txtColor,rcContent,foreColor){
    var w, h = rcContent.width(), rcContent.height();
    var cell_w = w / rowNum;
    var cell_h = h / colNum; 
    
    for(i=1; totalSize; 1){
        var x =(i-1) % rowNum;
        var y = math.floor((i-1)/rowNum);
        if(tt_finish[i]==1){
           var brush = gdip.solidBrush(tt_color[i]);  
           graphics.fillRectangle(brush, x*cell_w+1, y*cell_h+1, cell_w-1, cell_h-1);
        }
    }
    return true;     
}

//定时刷新plus
winform.plus.setInterval( 
    function(){
        winform.plus.redraw();
    },100 
)

winform.show();
win.loopMessage();


最新回复 (3)
  • shzhbook 6天前
    0 2

    厉害,希望多分享

  • 光庆 6天前
    0 3

    漂亮,比油特佛奥儿!

  • 小肥羊 5天前
    0 4
    666666666666
返回