为编程爱好者分享易语言教程源码的资源网
易语言源码视频(易学院) A全站文字广告,诚邀与您合作 建站,挂机器人,挂监控服务器 A全站文字广告,诚邀与您合作 三叶资源网官方③群:33301895
每日必买商品 20块一小时,一小时一结账 299买3年腾讯云服务器 B全站文字广告,诚邀与您合作 三叶资源网官方③群:33301895

网站首页 易语言相关 网络相关源码 正文

多线程进度下载文件源码,鱼刺模块队列和信号量的运用

三叶资源网 2019-06-09 网络相关源码 89 ℃ 0 评论

多线程进度下载文件源码,鱼刺模块队列和信号量的运用

@闯荡

.版本 2
.支持库 spec

.程序集 _下载
.程序集变量 fileHandle, 整数型
.程序集变量 fileSize, 长整数型
.程序集变量 unit, 长整数型
.程序集变量 queue, 鱼刺类_队列
.程序集变量 FileUrl, 文本型
.程序集变量 lic, 鱼刺类_临界许可
.程序集变量 ok, 长整数型
.程序集变量 callBack, 子程序指针

.子程序 _初始化, , , 当基于本类的对象被创建后,此方法会被自动调用

unit = 512 × 1024

.子程序 _销毁, , , 当基于本类的对象被销毁前,此方法会被自动调用

.如果真 (fileHandle > 0)
    关闭文件 (fileHandle)
.如果真结束


.子程序 初始配置, 逻辑型, 公开
.参数 url, 文本型
.参数 filepath, 文本型
.参数 back, 子程序指针, 可空
.局部变量 http, WinHttp_中文版
.局部变量 resHeader, 文本型
.局部变量 bool, 逻辑型

http.打开 (“GET”, url, )
http.设置协议头 (“Range”, “bytes=0-1/”)
http.发送 ()
resHeader = http.取所有协议头 ()
resHeader = 高级截取文本 (resHeader, “bytes 0-1/”, #换行符, , , , , )
fileSize = 到长整数 (resHeader)
.如果真 (fileSize ≤ 0)
    返回 (假)
.如果真结束
bool = 写到文件 (filepath, 取空白字节集 (fileSize))
.如果真 (取反 (bool))
    返回 (假)
.如果真结束
fileHandle = 打开文件 (filepath, , )
.如果真 (fileHandle = 0)
    返回 (假)
.如果真结束
分割 ()
FileUrl = url
callBack = back
调试输出 (fileSize, unit, fileHandle)
返回 (真)

.子程序 分割
.局部变量 i, 整数型
.局部变量 count, 整数型

queue.清空 ()
count = fileSize \ unit
.计次循环首 (count, i)
    queue.压入文本 (到文本 ((i - 1) × unit) + “-” + 到文本 (i × unit - 1), )
.计次循环尾 ()
queue.压入文本 (到文本 ((i - 1) × unit) + “-” + 到文本 (fileSize), )

.子程序 下载, , 公开
.局部变量 temp, 文本型
.局部变量 start, 长整数型
.局部变量 end, 长整数型
.局部变量 bin, 字节集
.局部变量 http, WinHttp_中文版
.局部变量 bool, 逻辑型
.局部变量 size, 长整数型

.如果真 (queue.取队列长度 () = 0)
    返回 ()
.如果真结束
queue.弹出文本 (temp)  ' 0-499
start = 到长整数 (取左边文本 (temp, “-”))
end = 到长整数 (取右边文本 (temp, “-”))
http.打开 (“GET”, FileUrl, )
http.设置协议头 (“Range”, “bytes=” + temp)
http.发送 ()
bin = http.取返回字节集 ()
size = 取字节集长度 (bin)
.如果真 (size ≠ unit 且 size ≠ end - start)
    queue.压入文本 (temp, )
    返回 ()
.如果真结束

lic.进入 ()
bool = 移动读写位置 (fileHandle, #文件首, start)
.如果真 (取反 (bool))
    调试输出 (“移动读写位置失败”)
    lic.退出 ()
    返回 ()
.如果真结束
bool = 写出字节集 (fileHandle, bin)
.如果真 (取反 (bool))
    调试输出 (“写出字节集失败”)
    lic.退出 ()
    返回 ()
.如果真结束
lic.退出 ()

原子_运算 (ok, size)

.如果真 (到整数 (callBack) > 0)
    调用子程序 (callBack, , , ok, fileSize)
.如果真结束

' 调试输出 (size, ok, fileSize)
.如果真 (ok = fileSize)
    关闭文件 (fileHandle)
    fileHandle = 0

.如果真结束


.子程序 取状态, 逻辑型, 公开

返回 (fileHandle = 0)
文件下载

Tags:多线程进度下载队列信号量

来源:三叶资源网,欢迎分享,公众号:iisanye,(三叶资源网官方③群:33301895

猜你喜欢

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

百度站内搜索
关注微信公众号
三叶资源网官方③群:三叶资源网官方③群

网站分类
随机tag
音速启动易语言常见错误多线程特训班博彩数据酷QE语言易语言视频教程Unicodepost通信开源皮肤制作翻译模块检测OD模块邮箱登陆集中营易语言app协议内存池源码微信抖音脚本ICO图标生成
最新评论