Вверх ↑
Ответов: 4621
Рейтинг: 746
#1: 2021-02-11 17:41:05 ЛС | профиль | цитата
MBO писал(а):
А есть ли какой-то способ размножать потоки?
Это можно реализовать динамическим контейнером, когда в каждом экземпляре схемы находится поток, выполняющий работу и HTTPClient. Логика такая: подготавливаются данные для каждого потока. Создаётся новый экземпляр динамического контейнера, в него подаются соответствующие данные. Когда все экземпляры подготовлены, потоки каждого экземпляра запускаются на выполнение. Но это все равно может быть не тем, что ожидается, там могут быть различные проблемы.
Подходящая реализация - запуск фиксированного количества потоков, каждому из которых дается часть общего списка запросов и он свою часть выполняет последовательно, как описано выше для одного.

MBO писал(а):
Но первый при этом не прерывается, а ждет ответа от сервера
Опять же, количество потоков в ситеме ограничено, большое количество вызывает проблемы. Запускаем новый, не дождавшись предыдущего - получаем постоянное увеличение потребления ресурсов (параллельных потоков, сетевых соединений и т.д.).

MBO писал(а):
Вобще, я останавливаю поток и запрос для того, что бы можно было обработать предыдущий ответ в случае ошибки и отправить еще один (уже другой) запрос
Для этого у компонента HTTPClient есть событие onError или точка StatusCode. По завершении запроса обрабатываешь результат, если произошла ошибка - ставишь ещё один HTTPClient для выполнения другого запроса в случае ошибки. Все это выполняется в том же потоке, который делал первый запрос.
Следует отличать:
- "в случае ошибки выполнить другой запрос" - это как написал
- "в случае ошибки перейти к следующему запросу" - это решается выше описанным перебором списка запросов.

Остается вопрос: в случае ошибки выполнить другой запрос, а если ошибки не произошло - что надо сделать? А если и этот другой запрос выполнился с ошибкой - что надо сделать? А если успешен?

MBO писал(а):
Можно ли вообще как-то посмотреть занятые и освобожденные программой ресурсы? А управлять ими средствами HiAsm?
В контексте обсуждаемой задачи - нет. Потому что управлением занимается компонент, и утечка происходит по причине ущербной логики (а точнее - только по причине принудительной остановки потока исполнения). Убираешь обрыв потока - убираешь одну из двух проблем: утечку ресурсов. И остаешься один на один с проблемой логики: как выполнить свою задачу, дожидаясь завершения предыдущего запроса.
Любое "внешнее управление ресурсами" при той же логике будет приводить к тем же результатам.

И это не проблема HTTPClient. В HTTP_Get происходит ровно то же самое, просто ты не заглядывал внутрь. А там не стоит проверки на повторный запуск. Запустил первый запрос - он запустился в параллельном потоке и ожидает ответа сервера. А ты в это время запускаешь второй запрос. Проверки в компоненте нет, ты думаешь "вау, второй запрос пошел" (или думаешь компонент там внутри сам знает что ему надо отменить предыдущий?). И ждешь результатов второго запроса. А в этот момент там внутри проснулся первый запрос, о котором компонент уже забыл, и выдал событие onDownload. А ты думаешь что это событие с результатом второго запроса. А если пять запросов одновременно выполнить - какое по порядку событие данные какого по порядку запроса будет выдавать?
карма: 26

0
Редактировалось 10 раз(а), последний 2021-02-12 11:52:31