搜索
查看: 22513|回复: 36

[网络] 多线程多文件断点续传下载

    [复制链接]

36

主题

741

帖子

4408

积分

超级版主

Rank: 8Rank: 8

积分
4408
发表于 2013-6-21 09:53:56 | 显示全部楼层 |阅读模式
aardio范例里的代码,
thread.dlManager使用 thread.command 将工作线程与界面代码解耦、通过消息发布、订阅进行交互,
下载线程不关心谁接受消息,界面线程亦不必关心工作线程怎么下载,可以方便的支持多任务多线程下载,以及自定义界面。

  1. //多线程多任务下载
  2. import win.ui;
  3. /*DSG{{*/
  4. var winform = ..win.form(text="多线程多文件断点续传下载";right=765;bottom=399)
  5. winform.add(
  6. button={cls="button";text="多线程多文件断点续传下载";left=478;top=356;right=703;bottom=392;db=1;dr=1;z=2};
  7. listview={cls="listview";left=10;top=16;right=757;bottom=346;bgcolor=16777215;db=1;dl=1;dr=1;dt=1;edge=1;z=1}
  8. )
  9. /*}}*/

  10. //初始化listview控件
  11. winform.listview.insertColumn("网址",180);
  12. winform.listview.insertColumn("文件名",180);
  13. winform.listview.insertColumn("状态",100);
  14. winform.listview.insertColumn("大小",80);
  15. winform.listview.insertColumn("速度",80);
  16. winform.listview.insertColumn("已下载",120);
  17. winform.listview.adjust = function(cx,cy){
  18.     winform.listview.fillParent(1);
  19. }

  20. //创建下载线程管理器
  21. import thread.dlManager;
  22. var dlmgr = thread.dlManager(5/*最多允许五个线程同时下载*/);

  23. //响应下载事件
  24. dlmgr.onReceiveBegin = function(id,url,filename,statusText,httpStatusCode,totalSize,downSize){
  25.     winform.listview.setItemText( {url;filename;statusText;fsys.formatSize(totalSize);fsys.formatSize(downSize) },id )
  26. }
  27. dlmgr.onReceive = function(id,sizePs,downSize){
  28.     winform.listview.setItemText( fsys.formatSize(downSize),id,6);
  29.     winform.listview.setItemText( fsys.formatSize(sizePs) + "/s" ,id,5);
  30. }
  31. dlmgr.onEnd = function(id,savepath,resumePath,contentLength){
  32.         if( savepath ){
  33.         winform.listview.setItemText(  "已完成"  ,id,3);
  34.         winform.listview.setItemText( fsys.formatSize(contentLength),id,4);
  35.     }
  36.     else {
  37.         winform.listview.setItemText(  "已停止"  ,id,3);
  38.     }
  39.     winform.listview.setItemText(  "0KB/s"  ,id,5);
  40.     //fsys.delete(resumePath)
  41. }
  42. dlmgr.onError = function(id,err){
  43.     winform.listview.setItemText( err,id,3);
  44. }

  45. winform.button.oncommand = function(id,event){       

  46.     //添加下载任务非常简单,push下载参数就可以了
  47.     //注意这里为了简化示例,任务id使用了listview控件的行号,如果需要删除行则需要使用一个表保持id与行号的映射关系
  48.     dlmgr.push(
  49.         id = winform.listview.addItem( "http://oss.aau.cn/aardio/ide/aardio.7z" );
  50.         url = "http://oss.aau.cn/aardio/ide/aardio.7z";
  51.         filename="aau.7z"; //文件名可以省略
  52.         savedir = "/downlaod/";
  53.     )
  54.    
  55.     dlmgr.push(
  56.         id = winform.listview.addItem( "http://oss.aau.cn/aardio/ide/aardio.zip" );
  57.         url = "http://oss.aau.cn/aardio/ide/aardio.zip";
  58.         savedir = "/downlaod/"; //文件名可以省略
  59.     )
  60.    
  61.     winform.button.disabled = true;
  62. }

  63. //下载任务右键管理菜单
  64. import win.ui.menu;
  65. winform.listview.onnotify = function(id,code,ptr){  
  66.       if( code = 0xFFFFFFFB/*_NM_RCLICK*/ ){
  67.       
  68.           var x,y = win.getMessagePos();  
  69.           var nmListView = winform.listview.getNotifyMessage(code,ptr);
  70.          
  71.           //创建弹出菜单
  72.         var popmenu = win.ui.popmenu(winform);
  73.         popmenu.add('取消',function(id){
  74.             dlmgr.cancel( nmListView.iItem )
  75.         } )
  76.         popmenu.popup(x,y,true);
  77.         popmenu.close();
  78.       }
  79. }

  80. //关闭窗体时停止所有下载
  81. import thread.event;
  82. winform.onClose = function(hwnd,message,wParam,lParam){
  83.     winform.text = "正在等待关闭";
  84.     dlmgr.quit();
  85. }

  86. //显示主窗体
  87. winform.show()
  88. win.loopMessage();
复制代码
dl.png

评分

参与人数 4银币 +110 收起 理由
oney + 10 很给力!
itworm + 30 赞一个!
dem + 30 神马都是浮云
leisurely + 40 很给力!感谢超版分享。

查看全部评分

回复

使用道具 举报

12

主题

73

帖子

621

积分

培训班

积分
621
发表于 2013-6-21 10:01:57 | 显示全部楼层

对我非常有用,学习了,感谢超版分享,谢谢。

对我非常有用,学习了,感谢超版分享,谢谢。
回复

使用道具 举报

5

主题

82

帖子

662

积分

培训班

积分
662
发表于 2013-6-21 10:02:41 | 显示全部楼层

好东西,谢谢分享,学些下

好东西,谢谢分享,学些下
回复

使用道具 举报

10

主题

497

帖子

2731

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2731
发表于 2013-6-21 10:10:34 | 显示全部楼层

[align=left][font=新宋体][quote]command.onReceiveBegin = [color=#0000ff]function[/c

command.onReceiveBegin = function(filename,lable,statusCode,contentLength,fileSize){
   
return winform.listview.addItem( { filename;lable;fsys.formatSize(contentLength + fileSize);fsys.formatSize(fileSize) } );
}
这样写就可以,
winform.listview.addItem() 的返回值实际上就是自己所在的行号( 也就是winform.listview.count )
回复

使用道具 举报

0

主题

19

帖子

160

积分

一级会员

Rank: 2

积分
160
发表于 2013-6-21 10:36:01 | 显示全部楼层

这个必须收藏

这个必须收藏
回复

使用道具 举报

5

主题

76

帖子

462

积分

二级会员

Rank: 3Rank: 3

积分
462
发表于 2013-6-21 10:54:00 | 显示全部楼层

顶起,收藏起来先。

顶起,收藏起来先。
回复

使用道具 举报

18

主题

115

帖子

650

积分

培训班

积分
650
发表于 2013-6-21 11:17:27 | 显示全部楼层

学习 多线程

学习 多线程
aardio —— 我爱你!
回复

使用道具 举报

5

主题

77

帖子

485

积分

二级会员

Rank: 3Rank: 3

积分
485
发表于 2013-6-21 11:21:50 | 显示全部楼层

好东西,又能学习到知识了。感谢分享!

好东西,又能学习到知识了。感谢分享!
回复

使用道具 举报

0

主题

1

帖子

11

积分

新手入门

Rank: 1

积分
11
发表于 2013-6-21 11:31:41 | 显示全部楼层

学习 多线程

学习 多线程
回复

使用道具 举报

7

主题

70

帖子

475

积分

二级会员

Rank: 3Rank: 3

积分
475
发表于 2013-6-21 20:56:00 | 显示全部楼层

我是来学习并顶你的

我是来学习并顶你的
回复

使用道具 举报

4

主题

47

帖子

396

积分

二级会员

Rank: 3Rank: 3

积分
396
发表于 2013-6-21 22:02:56 | 显示全部楼层

太棒了。很有启发。

太棒了。很有启发。
回复

使用道具 举报

7

主题

306

帖子

1911

积分

四级会员

Rank: 6Rank: 6

积分
1911
QQ
发表于 2013-6-22 09:43:48 | 显示全部楼层

感谢分享,学习!

感谢分享,学习!
每天进步一点点......
回复

使用道具 举报

2

主题

6

帖子

57

积分

一级会员

Rank: 2

积分
57
发表于 2013-6-22 13:10:45 | 显示全部楼层

一直想要这样的功能,终于有例子了

一直想要这样的功能,终于有例子了
回复

使用道具 举报

2

主题

6

帖子

57

积分

一级会员

Rank: 2

积分
57
发表于 2013-6-22 13:14:17 | 显示全部楼层

如何点击按钮暂停/继续下载呢?版主大哥,也加上个例子吧

如何点击按钮暂停/继续下载呢?版主大哥,也加上个例子吧
回复

使用道具 举报

10

主题

497

帖子

2731

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2731
发表于 2013-6-22 14:53:24 | 显示全部楼层

[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=59219&ptid=10472][c

cokar 发表于 2013-6-22 13:14
如何点击按钮暂停/继续下载呢?版主大哥,也加上个例子吧

控制线程暂停继续的例子有很多,用 thread.event 就可以。
而且这个是断点续传,停止了可以自动恢复下载进度 。有想法就自己动手丰衣足食 - 指望别人是不行的。
回复

使用道具 举报

0

主题

27

帖子

147

积分

一级会员

Rank: 2

积分
147
发表于 2013-6-22 16:31:00 | 显示全部楼层

超版的代码真漂亮,学习了,谢谢~~

超版的代码真漂亮,学习了,谢谢~~
回复

使用道具 举报

7

主题

88

帖子

590

积分

三级会员

Rank: 4

积分
590
发表于 2013-6-22 18:00:25 | 显示全部楼层

感谢分享.谢谢楼主.

感谢分享.谢谢楼主.
本人男,爱好女!
http://www.hxcarrot.com
回复

使用道具 举报

6

主题

65

帖子

393

积分

荣誉会员

Rank: 8Rank: 8

积分
393
发表于 2013-6-24 13:56:32 | 显示全部楼层

好东西,谢谢分享,学些下

好东西,谢谢分享,学些下
回复

使用道具 举报

36

主题

182

帖子

1142

积分

四级会员

Rank: 6Rank: 6

积分
1142
发表于 2013-6-25 13:54:54 | 显示全部楼层

例子真棒!

例子真棒!
回复

使用道具 举报

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2017-9-22 06:59 , Processed in 0.343750 second(s), 29 queries , Wincache On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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