Вверх ↑
Ответов: 4401
Рейтинг: 690
#1: 2021-02-14 14:37:38 ЛС | профиль | цитата
MBO писал(а):
Можно ли в одном потоке запускать несколько отправок запросов?
Можно. Последовательно. Несколько HTTPClient, выполняющие запросы по результатам предыдущих.
MBO писал(а):
Можно ли стопить поток чтобы обработать ответ?
Ответы обрабатываются в том же потоке, где выполняется запрос. Зачем его останавливать, если он и так стоит пока ты обрабатываешь ответ (например, не начнет выполнять следующий запрос).
MBO писал(а):
Может как то можно переписать хттп клиент чтобы не париться с потоками?
Thread+HTTPClient полностью эквивалентны HTTP_Get с потоком внутри. Ты преполгаешь что смог бы "стопить поток, чтобы обработать ответ", если бы использовал HTTP_Get?
MBO писал(а):
На компиляторе делфи такой ошибки не возникало, она появилась на fpc32 может там проблема?
Ошибки параллельных потоков (например, незащищенный доступ к визуальным компонентам), насколько я заметил, проявляются на FPC с большей вероятностью. Но это не значит что на Delphi они перестают быть ошибками.
MBO писал(а):
А, может быть, поможет действительно вызывать поток внутри контейнера (faststop=true) с отправкой запроса. А на выходе поставить synchronize?
FastStop=True требует твоих таймеров, чтобы они постоянно запускали поток, который постоянно останавливается. То-есть, ты опять наступаешь на те же грабли с попыткой обработки результатов параллельного потока из других потоков. А отсюда - желание остановить параллельный поток, не дождавшись его завершения (таймер в другом потоке ведь ждать не будет). Так MMTimer или Thread(FastStop=False) заменяют необходимость постоянного перезапуска Thread.
MBO писал(а):
Или может быть есть возможность сначала, при отправке поток запустить, а перед выходом из контейнера остановить?
А зачем? Потому что на событии выхода из контейнера не получается опять запустить тот же поток, потому что он ещё не остановлен? Так MMTimer или Thread(FastStop=False) извне контейнера решают эту задачу. Достаточно на выходе из контейнера не запускать поток, а просто ничего не делать (оно и так запущено и в цикле выполняет то что надо). А по результатам обработки можно только остановить выполнение. Собственно, MMTimer или Thread(FastStop=False) можно и внутрь засунуть - эффект тот же.

MBO писал(а):
А то у меня работа программы завязан на остановке главного таймера (как в ручную так и программно при возникновении ошибок для генерации нового запроса)
Так MMTimer или Thread(FastStop=False) извне контейнера прекрасно останавливаются и запускаются по любым командам.
карма: 26

0
Редактировалось 3 раз(а), последний 2021-02-14 14:44:03