![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите разобраться с вот этим кодом... [D6, WinXP]
Senti © (2005-07-22 12:08:00)Есть код, написанный для передачи файлов через компонент ICS.
Одна проблема он получает весь файл в буфер (Pchar) и потом по завершении всей передачи сохраняет на диск, что неприемлимо для больших файлов. К сожалению, не могу разобраться с принципом приема. Необходимо модифицировать так, чтобы каждый блок он сбрасывал в FileStream и обнулял буфер, до получения следущего блока.
Вот сам код:
Пояснение Rcvd : Pchar;
WritePtr : Integer;
procedure TRcvThread.RcvWSocket1DataAvailable(Sender: TObject; Error: Word);
var
Count : Integer;
Verb : String[255];
begin
if Error <> 0 then begin
Log(ltError, 'ClientDataAvailable ' + IntToStr(Error));
Exit;
end;
with Sender as TThreadClient do
try
if IsRcvBin then begin
Count := Receive(Rcvd + WritePtr, FileSize - WritePtr); // Вот с этим не могу разобраться :(((... Странно он их получает. Особенно Rcvd+WritePtr... Как можно к Pchar прибавить integer.. + с каждым разом уменьшается разбер принятого буфера FileSoze-WritePtr...
if Count <= 0 then // Проверяем есть ли данные
Exit;
inc(WritePtr, Count); // Подсчитыем кол-во полученного
if WritePtr = FileSize then
SaveRcvdFile; // Если размер принятого равен размеру файла, то сохраняем его...
Exit;
end;
Count := Receive(@Verb[1], High(Verb)); // При первых данных принимает имя и размер файла.
if Count <= 2 then
Exit;
Verb[0] := Chr(Count - 2); { remove CrLf }
Log(ltRx, Verb);
if FileName = '' then
FileName := Verb
else begin
FileSize := StrToInt(Verb);
GetMem(Rcvd, FileSize);
IsRcvBin := True; // Включаем режим передачи данных
LineMode := False; // Отключаем режим приема строк
end;
except
on E: exception do begin
// Log(ltError, 'ClientDataAvailable ' + E.ClassName + ': ' + E.Message);
CloseDelayed;
end;
end;
end;
Модифицировать не сложно... Но не могу разобраться в самом механизме приема... Помогите кто чем сможет :)
Senti (2005-07-22 13:16:00) [1]Count : integer // объем принятой информации функции Receive.
Rcvd : Pchar // буфер куда собирается принятая инфа
FileSize, WritePtr : Integer;
Функция:
Receive(Buffer : Pointer; BufferSize: integer) : Integer;
Digitman (2005-07-22 13:12:00) [2]
> Для чего это сделано ?
мало ли для чего ..
по тому шматку содранного тобой кода никаких умозаключений сделать невозможно - декларации этих идентификаторов и фрагменты кода инициализации отсутствуют напрочь
Senti (2005-07-22 13:05:00) [3]Да, это понятно но в коде он прописан как Rcvd+WritePtr... Для чего это сделано ?
Digitman (2005-07-22 12:47:00) [4]
> Как можно к Pchar прибавить integer
PCharValue := PChar(Integer(PCharValue) + IntegerValue);