多线程进度下载文件源码,鱼刺模块队列和信号量的运用
.版本 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)
队列鱼刺
鱼刺类队列