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

THTTPClient асинхронность


kiz35196

Вопрос

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

  • 2

Не обязательно выносить в отдельный тред этот класс. Достаточно воспользоваться асинхронными методами. Ознакомиться с ним возможно в демке от Идеры: 

Цитата

D:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples\Object Pascal\RTL\HttpAsyncDownload

 

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

Лучше использовать потоки, т.к. сейчас все моб. девайсы имеют многоядерные процессоры.

TThread.CreateAnonymousThread(
    procedure
    begin

// код      

TThread.Queue(nil,
        procedure
        begin

//   здесь код выполнится только по окончании работы потока (отложенный), в главном потоке.
              // здесь можно работать с формой.

        end);
    end
  ).Start;


 

TThread.CreateAnonymousThread(procedure ()
  begin
         
        TThread.Synchronize (TThread.CurrentThread,
          procedure ()
          begin

  // код выполнится в главном потоке, - к примеру чтобы показать прогресс на форме. и затем 

 //  поток продолжит работу.

          end);

  end).Start;

 

Всегда помните что нельзя работать с формой из других потоков, без методов синхронизации.

Только в главном, иначе будут случайные AV ошибки.

Еще почитайте.

http://blog.marcocantu.com/blog/2014_may_background_delphi_android_threads.html

 

Изменено пользователем ENERGY
Ссылка на комментарий
  • 0
В 20.03.2018 в 11:41, krapotkin сказал:

не надо ничего включать. сделаете только хуже код. выносите в отдельный поток. 

 

1 час назад, ENERGY сказал:

Лучше использовать потоки, т.к. сейчас все моб. девайсы имеют многоядерные процессоры.


TThread.CreateAnonymousThread(
...

 


TThread.CreateAnonymousThread(procedure ()
  begin
....

 

Можете немного подробнее, с чем связано это? Чем стандартная реализация асинхронности не устраивает? Используем около года в довольно сильно нагруженном приложении для асинхронных вызовов API, нареканий не было, Delphi Berlin Update 2. Или сломали реализацию в Tokyo?

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

TThread.CreateAnonymousThread(procedure ()   begin                   TThread.Synchronize

Вы реально используете такой код? Небось на 3G соединениях ещё не тестировали... Жуть.

13 часов назад, Fedor K сказал:

Используем около года в довольно сильно нагруженном приложении для асинхронных вызовов API,

(почти) все обращения к api потоко-независимы. А вот если одновременно из двух потоков сделать memo1.lines.add(..) то будет в лучшем случае бред в результате, в худшем - AV. 
 

Ссылка на комментарий
  • 0
15 минут назад, Akad сказал:

(почти) все обращения к api потоко-независимы. А вот если одновременно из двух потоков сделать memo1.lines.add(..) то будет в лучшем случае бред в результате, в худшем - AV. 

1. Тут была идея подчеркнуть, что используется именно асинхронность самого THTTPClient, а не постройка своего велосипеда. 

2. Можете дать пример кода вашей записи memo1? Или вы имеете ввиду обращение к UI без синхронизации?

Ссылка на комментарий
  • -1
1 час назад, Fedor K сказал:

1. Тут была идея подчеркнуть, что используется именно асинхронность самого THTTPClient, а не постройка своего велосипеда.

С асинхронностью все печально. Ну то есть использовать можно, но отгрести всевозможных проблем на машинах пользователей тоже... Поэтому лучше отдельный поток и callback. Причём эта практика самая распространённая на всех платформах и api.

1 час назад, Fedor K сказал:

2. Можете дать пример кода вашей записи memo1? Или вы имеете ввиду обращение к UI без синхронизации?

Synchronize, а дальше делай что хочешь. В XE 10.x.x будут проблемы в некоторых случаях, но на более ранних всё работало отлично.
 

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

С асинхронностью все печально. Ну то есть использовать можно, но отгрести всевозможных проблем на машинах пользователей тоже... Поэтому лучше отдельный поток и callback. Причём эта практика самая распространённая на всех платформах и api.

Synchronize, а дальше делай что хочешь. В XE 10.x.x будут проблемы в некоторых случаях, но на более ранних всё работало отлично.
 

Что конкретно печально в асинхронности клиента? На какой платформе? Если с примером - то вообще замечательно.

п.с. Еще раз повторю, что нареканий со стороны работы асинхронности не было замечено в течении года в нагруженном мобильном приложении на обоих осях, Delphi Berlin Update 2.

 

Ссылка на комментарий
  • -3
В 28 марта 2018 г. в 21:21, Fedor K сказал:

Что конкретно печально в асинхронности клиента? На какой платформе? Если с примером - то вообще замечательно.

TIdHTTP - попробуйте асинхронно что-то сделать. Только в потоке. Все другие indy - тоже самое. Остаются всякие страшные TcpClient1 которые из версии в версию то работаю то не работаю. Причём http - ручками. Ещё то удавольствие.

В 28 марта 2018 г. в 21:21, Fedor K сказал:

Еще раз повторю, что нареканий со стороны работы асинхронности не было замечено в течении года в нагруженном мобильном приложении на обоих осях, Delphi Berlin Update 2.

Сейчас под всеми платформами, что мне известны продвигается синхронный метод+callback. Что диез под виндой, что RxJava/Retrofit под андроид и т.д. Если используете что-то не традиционное - ни каких проблем. Но зачем это советовать другим? Поддерживать стереотип, что программист дельфи - быдлокодер-неформал?
 

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

TIdHTTP - попробуйте асинхронно что-то сделать. Только в потоке. Все другие indy - тоже самое. Остаются всякие страшные TcpClient1 которые из версии в версию то работаю то не работаю. Причём http - ручками. Ещё то удавольствие.
 

Пожалуйста, внимательней прочтите тему, здесь идет речь про асинхронный THTTPClient, а не про Indy компоненты. Если в вашем приложении до сих пор используется Indy, то советую от него избавляться.

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

Сейчас под всеми платформами, что мне известны продвигается синхронный метод+callback. Что диез под виндой, что RxJava/Retrofit под андроид и т.д. Если используете что-то не традиционное - ни каких проблем. Но зачем это советовать другим? Поддерживать стереотип, что программист дельфи - быдлокодер-неформал?
 

Пожалуйста, будьте более культырными в своем общении, этот форум нацелен повысить уровень делфи программистов, а не унизить кого-то и пустить по плохому пути.

THTTPClient успешно делает асинхронные запросы и синхронизирует callback для обработки, поэтому использовать его в синхронном режиме и добавлять свою реализацию асинхронности считаю лишними затаратами ресурсов.

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

Если в вашем приложении до сих пор используется Indy, то советую от него избавляться.

Ээээ...Что бы избавиться - должна быть альтернатива. Для сети в дельфи есть только комплект инди компонент. Они нормально работают с шифрованием и парой десятков протоколов. Альтернатив им нет ни стандартных, ни альтернативных. Или я что-то пропустил?

THTTPClient/THTTPServer - это даже не смешно. Особенно последний - который половину соединений пропускает при хоть какой-то нагрузке. Клиенту после этих фокусов сервера доверия нет. И смысл только его использовать, даже если он работает болемешно, если есть инди с единой архитектурой и базовыми структурами данных? Где тебе сразу и tcp и udp и smtp и так далее? И всё в едином стиле

1 час назад, Fedor K сказал:

Пожалуйста, будьте более культырными в своем общении, этот форум нацелен повысить уровень делфи программистов,

Ни кого не хотел обидеть. Я тоже процентов на 40 дельфи программист. Последний мой проект (пока) на дельфи целиком. А это сервер и клиенты под разными ОС. Но достаточно зайти на любой ресурс где "тусят крутые, всезнающие хомячки" типа хабра, и послушать их мнение про Delphi в целом, и программистов, которые пишут на этом языке в частности. При всём идиотизме их заявлений, рациональное зерно там можно проследить. И если весь мир делает в архитектуре приложений определённые паттерны, то наверно не спроста, и незачем делать по другому.

 

Изменено пользователем Akad
Ссылка на комментарий
  • 0
11 минут назад, Akad сказал:

THTTPClient/THTTPServer - это даже не смешно. 

THTTPClient - стабильно работает на 4 платформах, как https так и http, никогда с ним проблем не было, Писал даже RESTAPI на DropBox и API под корпоративный сервер. А с Indy есть проблемы под Android 6 и выше, - не работает https без шаманства. 

Про THTTPServer не знаю. Так что не понятно что вас рассмешило

Ссылка на комментарий
  • 0
7 минут назад, ENERGY сказал:

А с Indy есть проблемы под Android 6 и выше, - не работает https без шаманства. 

Можно по подробнее, что за проблемы? В руках 2 телефона на 6 и 1 на 7.1 - ни где у меня с клиентом проблем нет.
 

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

@Akad, У Вас есть опыт работы с TNetHTTPClient компонентом или классом THTTPClient? Как и где вы это использовали? Что не понравилось? Какие трудности были?

... можете не отвечать, я уже глянул ваши предыдущие сообщения и смысла в продолжении беседы не вижу

@kiz35196 Наиболее простой вариант Вы можете глянуть в этом посте.

Ссылка на комментарий
  • 0
9 минут назад, Akad сказал:

Можно по подробнее, что за проблемы? В руках 2 телефона на 6 и 1 на 7.1 - ни где у меня с клиентом проблем нет.
 

Значит вы не используете https. Поищите на форуме по словам Indy https (ssl) Android 6  

http://fire-monkey.ru/topic/1922-android-60-не-удается-загрузить-ssl-библиотеку/ 

http://fire-monkey.ru/forum/368-ssl/

 

Изменено пользователем ENERGY
Ссылка на комментарий
  • 0
В 20.03.2018 в 11:07, kiz35196 сказал:

как включитьт её если у меня компонент не на форме,а создается через THTTPClient.create; ?

 

Var FIAsyncResult : IAsyncResult;
	procedure DoEndDownload(const ASyncResult: IAsyncResult);
....
  FHTTPClient:=THTTPClient.Create;
  FHTTPClient.ResponseTimeout:=FResponseTimeout;
  FHTTPClient.ConnectionTimeout:=FConnectionTimeout;

  FIAsyncResult:=FHTTPClient.BeginGet(DoEndDownload, 'https://.....');

procedure TServiceData.DoEndDownload(const ASyncResult: IAsyncResult);
Var LAsyncHTTPResponse : IHTTPResponse;
begin
  try
    LAsyncHTTPResponse:=THTTPClient.EndAsyncHTTP(AsyncResult);
  except
    on E:Exception do
      AErrorMessage:=E.Message;
  end;
  if Assigned(LAsyncHTTPResponse) then
  begin
    if LAsyncHTTPResponse.StatusCode = 200 then
      S:=LAsyncHTTPResponse.ContentAsString;
....

 

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

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

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

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

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

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

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

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

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

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

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