Перейти к содержанию
Fire Monkey от А до Я
  • 0

Надолго зависает код при загрузке из интернета


MaratBest

Вопрос

Добрый день !!!

есть вот такой код для загрузки текста с сайта и картинок.

Является ли это оптимальным кодом , или же есть проще код ?

после нажатии кнопки приложение зависает, довольно на долго ,

на реальном устройстве, иногда android выдает что программа зависла, и спрашивает зарыть приложение или нет.

может нужно в поток сделать ?

procedure TForm.Button3Click(Sender: TObject);   
procedure LoadWebImage(url: string; image : TBitmap);
var
  idhttp : TIdHTTP;
  ms : TMemoryStream;
begin
  IdHTTP := TIdHTTP.Create(nil);
  ms := TMemoryStream.Create;
  try
    idhttp.Get(url, ms);
    ms.Position := 0;
    image.LoadFromStream(ms);
  finally
    ms.Free;
    idhttp.Free;
  end;
end;

procedure LoadWebText(url: string);
var
  idhttp : TIdHTTP;
  ms : TMemoryStream;
begin
  IdHTTP := TIdHTTP.Create(nil);
  ms := TMemoryStream.Create;
  try
    idhttp.Get(url, ms);
    ms.Position := 0;
    memo1.Lines.LoadFromStream(ms);
  finally
    ms.Free;
    idhttp.Free;
  end;
end;
begin
   LoadWebText('http://google/text.php');
   LoadWebImage('http://google/screen1.png', image1.Bitmap);
end;

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
9 часов назад, Rusland сказал:

Именно в поток


  TTask.Run(
    procedure
    begin

      TThread.Synchronize(TThread.CurrentThread,
        procedure
        begin

        end); 

    end);

 

извиняюсь, а зачем TTask? Можно же одним TThread обойтись

Ссылка на комментарий
  • 0

Всем большое спасибо за ответы !!!

procedure TForm1.Button1Click(Sender: TObject);
begin
TTask.Run(
     procedure
     function LoadWebText(const URL: string): string;
       var
       MS: TStringStream;
       Return: IHTTPResponse;
     begin
      Result := '';
     with TNetHTTPClient.Create(nil) do
       begin
        MS := TStringStream.Create('', TEncoding.ANSI);
        Return := Get( URL, MS);
        Result := MS.DataString;
        MS.Free;
        Free;
       end;
     end;
     PROCEDURE LoadWebImage(URL: string) ;
       var
        IdHTTP: TNetHTTPClient;
        ms : TMemoryStream;
        begin
         IdHTTP := TNetHTTPClient.Create(nil);
         MS := TMemoryStream.Create;
         try
         idhttp.Get (URL, MS);
         MS.Position := 0;
         image1.Bitmap.LoadFromStream(MS);
         finally
         idhttp.Free;
         MS.FREE;
        end;
       enD;

     begin
        memo1.Lines.Text:=LoadWebText('http://google/text.php');
        LoadWebImage('http://google/screen1.png');
        // выполняем загрузку файла из интернета;

        TThread.Synchronize(nil, procedure
           begin
              // выполняем действия связанные с визуальными компонентами
              label1.Text:='Загрузка списка игр с сайта';
              label1.Repaint;
           end);
end);

   label1.Text:='';
end;

Заменил  TNetHTTPClient  и пробую через поток

в итоге image1 пустой, label1 надпись просто очищается и все 

при запуске в win32 при первом запуске в image1 какой то мусор, второй раз картинка грузится 

что делаю не так.....

Ссылка на комментарий
  • 0

действия с визуальными компонентами должны быть в Synchronize как тут и написано, а это не так

4 часа назад, MaratBest сказал:

image1.Bitmap.LoadFromStream(MS);

 

4 часа назад, MaratBest сказал:

memo1.Lines.Text:=LoadWebText('http://google/text.php');

кроме того Get это не процедура а функция, неплохо бы проверять результат выполнения.
ну и NetHttpClient это обертка над THttpClient так что логичнее в базовом функционале использовать именно его

Чтобы упростить отладку, я бы все-таки поступил олдскульно. Создал бы потомка TThread и там метод Execute все как положено. При выходе из потока нужно кинуть обработчик TMyThread.OnTerminate и там уже выполнять все работы с визуальными компонентами

Для первичной отладки я обычно создаю объект этого класса , но не стартую поток. а просто выполняю Execute
если все идет нормально, заменяю MyThread.Execute на MyThread.Start ...

Ссылка на комментарий
  • 0
2 часа назад, krapotkin сказал:

действия с визуальными компонентами должны быть в Synchronize как тут и написано, а это не так

7 часов назад, MaratBest сказал:

image1.Bitmap.LoadFromStream(MS);

 

7 часов назад, MaratBest сказал:

memo1.Lines.Text:=LoadWebText('http://google/text.php');

Спасибо за ответ.

вынес все вроде как нужно

procedure TForm1.Button1Click(Sender: TObject);
var
MStext:string;
begin
AniIndicator1.Enabled:=true;
label1.Text:='Загрузка ...';
memo1.Lines.Clear;
TTask.Run(
     procedure
     function LoadWebText(const URL: string): string;
       var
       MS: TStringStream;
       Http: THTTPClient;
     begin
        Result := '';
        Http:=THTTPClient.Create;
        MS := TStringStream.Create('', TEncoding.ANSI);
        Http.Get( URL, MS);
        Result := MS.DataString;
        MS.Free;
        Http.Free;
     end;

     begin
        MStext:=LoadWebText('https://hi-tech.mail.ru/news/samsung-galaxy-s8-photo/?frommail=1');
        TThread.Synchronize(nil, procedure
           begin
              // выполняем действия связанные с визуальными компонентами
              memo1.Lines.Text:=MStext;
              AniIndicator1.Enabled:=False;
           end);
     end);
   label1.Text:='';
end;

на win 32 код работает на ура !

на устройствах AniIndicator сперва запускается , через секунду зависает , запрос возвращается 

AniIndicator в половинчатом состоянии ... печалька

попробую 

2 часа назад, krapotkin сказал:

Чтобы упростить отладку, я бы все-таки поступил олдскульно. Создал бы потомка TThread и там метод Execute все как положено. При выходе из потока нужно кинуть обработчик TMyThread.OnTerminate и там уже выполнять все работы с визуальными компонентами

Для первичной отладки я обычно создаю объект этого класса , но не стартую поток. а просто выполняю Execute
если все идет нормально, заменяю MyThread.Execute на MyThread.Start ...

 

Ссылка на комментарий
  • 0

ну, потенциальное место проблемное есть в кодировке

ms создается в ANSI а вот get происходит в некоей дефолтной скорее всего UTF-8, т.к. никаких заголовков в HttpClient вы не установили. 

например

  FHttp:=THTTPClient.Create();
  FHttp.AcceptCharSet:='utf-8';
  FHttp.ContentType:='application/json';
  FHttp.Accept := 'application/json';
  FHttp.CustomHeaders['Accept-Language']:='ru_RU';

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...