Indy, Отправить тему и разрушенные контексты - PullRequest
1 голос
/ 07 октября 2009

Я использую Indy TIdTCPServer (D2009, Indy 10) для связи с клиентскими приложениями. В методе OnExecute я создаю задачу и ставлю ее в очередь. Рабочий поток выполняет задачу и помещает ее в очередь отправки. Затем очередь отправки отправляет ответ клиенту.

В потоке отправки я перебираю контекстный список сервера и ищу контекст, соответствующий IP-адресу и информации о порте, сохраненной в задаче. Затем выполните ряд команд отправки, которые иногда генерируют нарушения прав доступа (полагаю, что при отправке контекст разрушается).

Теперь к вопросу: как я могу убедиться, что контекст не закрыт, прежде чем я отправлю ответ? Можно ли с помощью Indy отправлять сообщения из отдельного потока или все должно выполняться в потоке Indy?

1 Ответ

2 голосов
/ 08 октября 2009

Вы можете попытаться сохранить список TIdTCPServer.Contexts заблокированным во время отправки данных, так как Контекст не освобождается до тех пор, пока он не будет удален из списка. Недостатком является то, что ни один клиент, который подключается / отключается / отправляется, не будет обрабатываться во время выполнения одной отправки.

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

В качестве альтернативы, если вы можете переписать свой код, чтобы переместить очередь отправки в сам контекст, это было бы лучше, да. Тогда ваш обработчик события OnExecute может периодически проверять очередь и отправлять данные, когда они доступны. Это также поможет повысить производительность, поскольку вы больше не сериализуете свои посылки, если у вас есть исходящие данные, готовые для нескольких клиентов одновременно.

...