Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Помогите разобраться с вот этим кодом...   Найти похожие ветки 

 
Senti   (2005-07-22 12:08) [0]

Есть код, написанный для передачи файлов через компонент 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;


Модифицировать не сложно... Но не могу разобраться в самом механизме приема... Помогите кто чем сможет :)


 
Digitman ©   (2005-07-22 12:47) [1]


> Как можно к Pchar прибавить integer


PCharValue := PChar(Integer(PCharValue) + IntegerValue);


 
Senti   (2005-07-22 13:05) [2]

Да, это понятно но в коде он прописан как Rcvd+WritePtr... Для чего это сделано ?


 
Digitman ©   (2005-07-22 13:12) [3]


> Для чего это сделано ?


мало ли для чего ..

по тому шматку содранного тобой кода никаких умозаключений сделать невозможно - декларации этих идентификаторов и фрагменты кода инициализации отсутствуют напрочь


 
Senti   (2005-07-22 13:16) [4]

Count : integer // объем принятой информации функции Receive.
Rcvd  : Pchar  // буфер куда собирается принятая инфа
FileSize, WritePtr : Integer;
Функция:
Receive(Buffer : Pointer; BufferSize: integer) : Integer;



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.047 c
1-1129180314
apellido
2005-10-13 09:11
2005.11.06
Возможно ли одной процедурой задать цвет объектам разных типов


3-1127815585
Андрей Жук
2005-09-27 14:06
2005.11.06
Шифрование данных в блобе


8-1118530099
VoloSoft
2005-06-12 02:48
2005.11.06
Надо перехватить PC-Speaker


14-1129150278
Германн
2005-10-13 00:51
2005.11.06
Непонятный глюк на форуме


2-1129306035
natik
2005-10-14 20:07
2005.11.06
работа с вордом