2016-02-20 28 views
0

我正在開發一個多線程的下載應用程序,下載工作正常,除非我下載一個zip文件:內容被下載,但當我嘗試提取它時,我得到:意外結束的檔案,我正在使用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); 

是什麼在我的代碼的問題? 謝謝dor你的回覆。

回答

4

您撥打MapViewOfFile()的參數將dwFileOffsetHighdwFileOffsetLow參數設置爲0,因此每個線程都將其數據寫入相同的文件偏移量0,從而相互覆蓋。您需要將視圖的文件偏移設置爲posBegin。另外,如果您尚未這樣做,請確保您已將文件預先分配給所有線程正在下載的文件總大小,並且已創建了相同大小的文件映射。

+1

正常情況下,當每個線程都覆蓋對方時,我只會得到文件的一部分,例如,如果我使用兩個線程,我只會得到文件的一半,但我得到文件的所有內容,所以我不明白這一點,你能告訴我如何改變文件視圖的偏移?關於分配,我創建了一個本地文件(沒有設置它的大小),然後我創建了一個映射文件,而我將其文件設置爲文件大小。這不夠嗎?如果不是,我怎樣才能設置一個本地文件(hFile)的大小? – Safa

+0

雷米是正確的。你的問題是,你所有的步伐都是將數據寫入文件中的同一位置。如果你將這個文件保存在你的硬盤上,然後逐字節比較你正在下載的文件,你會看到你的文件只包含部分所需的數據 – SilverWarior

相關問題