Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.01.2013, 14:00
Pcrepair
 
Сообщения: n/a
По умолчанию Замена указателей на Локал. Перем при работе функции в потоке

Добрый день. есть код загрузчика, использующий указатели:

Код:
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  
Старый 17.01.2013, 14:37
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

В первой функции указатели вообще не нужны (да и не верно используются), есть нормальный метод Read.

Теперь ответы:
Оба варианта одинакого плохи.
Нет не будет.

Почему плохи, потому что избыточны. Есть вариант TidHTTP.Get который читает прямо в строку.

ЗЫЖ Срочно убери ссылку из подписи
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 17.01.2013, 20:53
Pcrepair
 
Сообщения: n/a
По умолчанию

Цитата:
Сообщение от Aristarh Dark
В первой функции указатели вообще не нужны (да и не верно используются), есть нормальный метод Read.
Если можно, поподробнее, о чем вообще речь? метод Read ЧЕГО?
Ответить с цитированием
  #4  
Старый 17.01.2013, 23:59
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

TMemoryStream.Read
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #5  
Старый 18.01.2013, 09:35
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Смех

Код:
Result:=IdHTTP1.Get('');
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 18.01.2013, 21:04
Pcrepair
 
Сообщения: n/a
По умолчанию

а теперь загрузи к примеру:
http://edu.zelenogorsk.ru/projs/eko/braun/edu3.html
и посмотри что будет с кодировкой(РАД ХЕ3 у тебя надеюсь есть?)
лыбиться потом будешь
Ответить с цитированием
  #7  
Старый 19.01.2013, 18:43
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Смех

Код:
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  
Старый 19.01.2013, 20:53
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Он его не повторил (наверное сам списал), поэтому я и сказал что косяк с указателями.

По поводу кодировки: мужчина, если вы не понимаете как работает юникод - не жаловАйтесь, ей богу, даж смешно стало еще до того как загрузил
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #9  
Старый 19.01.2013, 23:32
Pcrepair
 
Сообщения: n/a
По умолчанию

уже можно и проще:

Код:
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);
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:00.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025