分多了没处花:探讨一下多线程下载同一文件时的客户端文件拼装问题

sodme 2003-08-26 11:11:14
日前,我用ICS组件在解决多线程下载同一个文件时,遇到了一个问题,就是多线程下载过程中如何把各个线程下载的文件块重新进行拼装,生成跟原来的文件相同的文件,原来的想法是把一个文件各自生成若干个小文件,等下载完成时再把这些小文件全部拼装起来。但是,这种作法肯定与FLASHGET的作法差距很大,我想在下载时就把下载的无序文件块放到一个文件中。

请网友给点思路或源码以作参考,谢谢!:)
...全文
102 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hiflower 2003-08-27
  • 打赏
  • 举报
回复
copy_paste(木石三) 的说法应该是正确的,我没有做过这方面的东东。
mme 2003-08-27
  • 打赏
  • 举报
回复
我觉得小文件全部拼装起来的方法也不错,我就是这样做的.
原因是:如果有一个线程传输出错了,那这个线程就会退出,麻烦就来了,其他全部线程都在等它下载完那,可惜它都不存在了,所以整个过程都停止了.你说,是不是啊!~~~~
copy_paste 2003-08-27
  • 打赏
  • 举报
回复
哦,申请文件的空间就是FileSeek,也就是定位,像下载工具一般这个是做成可选项,所以,你直接使用FileSeek就可以达到申请或定位的效果,就看自己怎么做.
copy_paste 2003-08-27
  • 打赏
  • 举报
回复
也不是什么先写小文件,最后再合成。
你看哪个下载工具这样做的?

一般First thread先得到filesize,然后申请那么大的空间(FileSeek(Handle, fileSize, soBegin)),以后,其它线程只要定位到自己要下载的位置,然后写文件就行了。

也就是N个线程,N个TFileStream,只不过是用共享写的方式打开文件的就行了。
copy_paste 2003-08-27
  • 打赏
  • 举报
回复
不用互斥啊
每个线程中,有一个TFileStream对象,它只是针对这个文件的StartSize -> EndSize进行写操作。
你看Http, FTP,它每个线程启动的时候,都是有当前线程请求文件的开始和结束的地方,所以,你管好每个线程的写就行了。
hiflower 2003-08-27
  • 打赏
  • 举报
回复
原因是:如果有一个线程传输出错了,那这个线程就会退出,麻烦就来了,其他全部线程都在等它下载完那,可惜它都不存在了,所以整个过程都停止了.你说,是不是啊!~~~~
--------------------------------
不是这样的。
其它线程不需要等另一个线程下载完成,而是多线程同时下载,只是在写文件流时进行互斥操作。并且每个线程下载一部分就可以写文件流,而不是本线程下载任务全部完成才写。如果一个线程在写文件流时出错,可以进行异常处理,释放互斥量,而不会阻塞其它线程。
answermyquestion 2003-08-26
  • 打赏
  • 举报
回复
同意:hiflower(花) 所说的,采用互斥访问应该比你讲那种方法更有效

特别是遇到一些大文件时可能更突出。

hiflower 2003-08-26
  • 打赏
  • 举报
回复
type
TMyThread=class(TThread)
BasePosition:Integer; // 线程可访问的文件起始位置
  Length:Integer; // 线程可访问的文件长度  
procedure Execute;override;
end;

var
LockFileAccess:TMultiReadExclusiveWriteSynchronizer;
f:TFileStream;

procedure TMyThread.Execute;
var
Count:Integer;
n:Integer;
Buff:PByte;
begin
Count:=0;
while Count<Length do
begin
//此处下载到 n 字节
// 下面将数据写入文件
LockFileAccess.BeginWrite;
f.Position:=BasePosition+Count;
f.Write(Buff^,n);
LockFileAccess.EndWrite;
Count:=Count+n;
end;
terminate;
Free;
end;

initialization
LockFileAccess:=TMultiReadExclusiveWriteSynchronizer.Create;
f:=TFileStream.Create(FileName,fmCreate);

finalization
LockFileAccess.Free;
f.Free;


hiflower 2003-08-26
  • 打赏
  • 举报
回复
用 TFileStream,各线程互斥访问

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧