• 0
kiz35196

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

Вопросы

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 ответов на этот вопрос

  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
23 минуты назад, krapotkin сказал:

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

окей,спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

если у нас поток,  то вызывается он один раз,  следовательно вместо синхронайз лучше просто онтерминейт 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Только что, krapotkin сказал:

если у нас поток,  то вызывается он один раз,  следовательно вместо синхронайз лучше просто онтерминейт 

Или TThread.Queue

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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;
....

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 03.04.2018 в 01:25, ENERGY сказал:

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

https://forums.embarcadero.com/thread.jspa?messageID=986842&tstart=0#986842

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


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

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