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你的回覆。
正常情況下,當每個線程都覆蓋對方時,我只會得到文件的一部分,例如,如果我使用兩個線程,我只會得到文件的一半,但我得到文件的所有內容,所以我不明白這一點,你能告訴我如何改變文件視圖的偏移?關於分配,我創建了一個本地文件(沒有設置它的大小),然後我創建了一個映射文件,而我將其文件設置爲文件大小。這不夠嗎?如果不是,我怎樣才能設置一個本地文件(hFile)的大小? – Safa
雷米是正確的。你的問題是,你所有的步伐都是將數據寫入文件中的同一位置。如果你將這個文件保存在你的硬盤上,然後逐字節比較你正在下載的文件,你會看到你的文件只包含部分所需的數據 – SilverWarior