存档意外结束,同时提取下载的存档

时间:2016-02-20 14:38:45

标签: multithreading delphi delphi-2010

我正在开发一个多线程下载应用程序,下载工作正常,除非我下载一个zip文件:内容已下载,但当我尝试提取它时,我得到:意外结束存档,我' m使用winrar。但问题与应用程序本身有关,更准确地说是多线程下载(当我使用一个线程时,我不会得到此错误)。 那么这里是代码的相关部分:

//Main thread Creates worker threads and starts them
for I := 1 to ThreadCount do
begin
  workerThreads[i]:=TWorkerThread.Create(URL,mapFile,PosBegin,size);
  PosBegin:= PosBegin + size;
end;

 //Code of worker thread:
HTTP.Request.Range := Format('%d-%d',[posBegin, posBegin + size -1]);
HTTP.Get(URL,ms);
data := MapViewOfFile(mapFile, FILE_MAP_WRITE, 0 ,0, size);
copymemory(data,ms.memory,ms.size);

我的代码中的问题是什么? 谢谢你的回复。

1 个答案:

答案 0 :(得分:4)

您对MapViewOfFile()的调用是将dwFileOffsetHighdwFileOffsetLow参数设置为0,因此每个线程都将其数据写入相同的文件偏移量0,从而相互覆盖。您需要将视图的文件偏移设置为posBegin

此外,如果您还没有这样做,请确保已将文件预先分配给所有线程正在下载的文件总大小,并创建了相同大小的文件映射。