2016-02-20 1 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); 

Что проблема в моем коде? Спасибо за ваши ответы.

ответ

4

Ваш вызов MapViewOfFile() устанавливает параметры dwFileOffsetHigh и dwFileOffsetLow в 0, поэтому каждый поток записывает свои данные в одно смещение файла 0, тем самым переписывая друг друга. Вам нужно установить смещение файла вида на posBegin.

Кроме того, если вы этого еще не сделали, убедитесь, что вы предварительно выделили файл для общего размера файла, загружаемого всеми потоками, и создали сопоставление файлов того же размера.

+1

Обычно, когда каждый поток переписывает друг друга, я получаю только часть файла, например, если я использую два потока, я получаю только половину файла, но я получаю все содержимое файла , поэтому я не понимаю этого, и не могли бы вы рассказать мне, как изменить смещение представления файла ?, о распределении, я создал локальный файл (без установки его размера), а затем я создал файл карты, а я установите его файл в файл. Разве этого недостаточно? Если нет, как я могу установить размер локального файла (hFile)? – Safa

+0

Реми правильно. Ваша проблема в том, что все ваши протекторы записывают данные в одно и то же место в вашем файле. Если вы заходите и сохраняете этот файл на своем жестком диске, а затем делаете побайтовое сравнение с загружаемым вами файлом, вы увидите, что ваш файл содержит только часть желаемых данных – SilverWarior

Смежные вопросы