![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый день. есть код загрузчика, использующий указатели:
Код:
function LoadPage(const Url: String): RawByteString;
var
HTTP: TIdHTTP;
HtmlPage: TMemoryStream;
T:TStringList;
begin
T:=TStringList.Create;
HTTP := TIdHTTP.Create(nil);
try
HtmlPage := TMemoryStream.Create;
try
HTTP.HandleRedirects := True;
HTTP.Get(Url, HtmlPage); (*получаем данные в поток памяти*)
(*------------------------------------------*)
SetLength(Result, HtmlPage.Size);
Move(HtmlPage.Memory^, Pointer(Result)^, HtmlPage.Size);
(*------------------------------------------*)
finally
FreeAndNil(HtmlPage);
end;
finally
FreeAndNil(HTTP);
FreeAndNil(T);
end;
end;Код:
function LoadPage(const Url: String): RawByteString;
var
HTTP: TIdHTTP;
HtmlPage: TMemoryStream;
T:TStringList;
begin
T:=TStringList.Create;
HTTP := TIdHTTP.Create(nil);
try
HtmlPage := TMemoryStream.Create;
try
HTTP.HandleRedirects := True;
HTTP.Get(Url, HtmlPage); (*получаем данные в поток памяти*)
(*---------------------------*)
HtmlPage.Position:=0;
T.LoadFromStream(HtmlPage);
Result:=T.Text;
(*---------------------------*)
finally
FreeAndNil(HtmlPage);
end;
finally
FreeAndNil(HTTP);
FreeAndNil(T);
end;
end;Внимание! Вопрос: - какой вариант функции предпочтительнее для использования в потоке (многопоточная загрузка страниц), учитывая использование памяти. - не будет ли в первом варианте вероятности использования одних и тех же сегментов памяти разными потоками |
|
#2
|
||||
|
||||
|
В первой функции указатели вообще не нужны (да и не верно используются), есть нормальный метод Read.
Теперь ответы: Оба варианта одинакого плохи. Нет не будет. Почему плохи, потому что избыточны. Есть вариант TidHTTP.Get который читает прямо в строку. ЗЫЖ Срочно убери ссылку из подписи |
|
#3
|
|||
|
|||
|
Цитата:
|
|
#4
|
||||
|
||||
|
TMemoryStream.Read
|
|
#5
|
||||
|
||||
|
Код:
Result:=IdHTTP1.Get(''); |
|
#6
|
|||
|
|||
|
а теперь загрузи к примеру:
http://edu.zelenogorsk.ru/projs/eko/braun/edu3.html и посмотри что будет с кодировкой(РАД ХЕ3 у тебя надеюсь есть?) лыбиться потом будешь |
|
#7
|
||||
|
||||
|
Код:
function TIdCustomHTTP.Get(AURL: string): string;
var
Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
try
Get(AURL, Stream);
finally
if Stream.Size > 0 then // DO we have result?
begin
SetLength(result, Stream.Size);
Move(PChar(Stream.Memory)^, result[1], Stream.Size);
end;
Stream.Free;
end;
end; |
|
#8
|
||||
|
||||
|
Он его не повторил (наверное сам списал), поэтому я и сказал что косяк с указателями.
По поводу кодировки: мужчина, если вы не понимаете как работает юникод - не жаловАйтесь, ей богу, даж смешно стало еще до того как загрузил ![]() |
|
#9
|
|||
|
|||
|
уже можно и проще:
Код:
Loader.Get(Url, mStream); (*получаем данные в поток памяти*)
(*передаем данные без искажений кодировки в в массив байтов строки TBytes*)
mStream.Position:=0;
SetLength(Buffer,mStream.Size);
mStream.Read(Buffer[0],Length(Buffer));
(*---------------------------*)
(*получаем ответы сервера*)
ServerResponse:=AnsiLowerCase(Loader.Response.Rawheaders.text);
ServerCharset:=AnsiLowerCase(Loader.Response.CharSet);
GetServerCharset(ServerCharset);
(*---------------------------*)
(*переносим массив байтов в первозданном виде на выход*)
//DataOut:=AnsiLowerCase(StringOf(B));
(*вызов функции конвертации кодовой страницы под язык используемый в ОС*)
DataOut:=CodePageConvert(Buffer);
Result:=(ServerCharset + #13#10 + #13#10 + ServerResponse + #13#10 + DataOut); |