![]() |
|
|
Регистрация | << Правила форума >> | 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); |