我正在开发一个多线程下载应用程序,下载工作正常,除非我下载一个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);
我的代码中的问题是什么? 谢谢你的回复。
答案 0 :(得分:4)
您对MapViewOfFile()
的调用是将dwFileOffsetHigh
和dwFileOffsetLow
参数设置为0,因此每个线程都将其数据写入相同的文件偏移量0,从而相互覆盖。您需要将视图的文件偏移设置为posBegin
。
此外,如果您还没有这样做,请确保已将文件预先分配给所有线程正在下载的文件总大小,并创建了相同大小的文件映射。