2016-08-12 14 views
0

Я делаю программу клиента в Delphi 7 с Indy 10.Indy10 TCP клиента доставить ответ на отправку процедуры

Он должен подключаться к серверу с TIdTCPClient и поддерживать соединение для отправки и получения команд и не отвечает до тех пор, программа закрыта.

Сервер может поддерживать только одно постоянное соединение для каждого клиента для отправки информационных сообщений. TIdTCPClient прослушивает поток чтения.

ВОПРОС:
Я посылаю запрос на сервер (используя WriteLn) из некоторой процедуры, чтобы получить список строк, например. Как я могу получить ответ (ответ) для этого запроса в той же процедуре, не покидая его? Подобно использованию TIdHTTP.

Я вижу 2 решения:

  1. делает запрос от одной процедуры и обработать его в другом - код и логика будет сложнее.

  2. для каждого запроса в процедуре, создайте новый TIdTCPClient (Connect, WriteLn, ReadLn, Disconnect, Free) и запрос на обработку. Но мне не нравится это решение, поскольку оно вызывает большие накладные расходы.

ответ

0

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

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

Как вы упомянули, ваше второе решение не очень хорошее.

Другим решением было бы создать TEvent для каждого запроса и поместить каждый запрос в список/очередь где-нибудь. Попросите поток чтения найти и передать соответствующее событие при получении ответа. После этого процедура отправки может ждать события до тех пор, пока не будет сигнализирована (например, TThread.Synchronize()). Если процедура выполняется в основном потоке, используйте MsgWaitForMultipleObjects() для ожидания, поэтому вы можете обслуживать основную очередь сообщений во время ожидания.

+0

Я очень благодарен за ваш ответ! К сожалению, мой опыт не позволяет мне реализовать это решение ( – Viktor