2016-04-23 5 views
0

Я использовал Indy большую часть времени в прошлом, но решил изменить существующий проект и использовать синапс вместо Indy. Хотя, у меня есть небольшой вопрос, чтобы спросить, что мы все знаем всякий раз, когда мы создаем объект сокета в Indy, он работает на своем собственном потоке, он выполняет все операции ввода-вывода в потоке, который он создал, и не освобождается или не закрывается до тех пор, пока объект свободен, я думаю.Synapse TTcpBlockSocket

Так что я очень хочу имитировать это на синапсе.

Т.Л., д-р:

Как создать Ttcpblocksocket объект таким образом, что он выполняет все свои операции ввода-вывода на потоке, который не получает завершенные, пока объект не свободен?

ответ

1

Обе библиотеки не создают поток для управления операциями сокета на стороне клиента. Это позволяет создавать и использовать их в главном потоке приложения - например, в обработчике событий VCL, который запускает HTTP-запрос, или переместить их в поток (например, ждать в фоновом режиме для сообщений, отправленных с сервера клиенту).

В Indy есть компонент TIdTCPServer, который создает потоки для обработки входящих данных одновременно, но в библиотеке Synapse AFAIK нет многопоточного серверного компонента TCP.

Т.Л., др

Там нет существенной разницы между Инди и Synapse TCP клиента компонентов относительно их использования с потоками.

+0

от того, что я видел в случае синапса, если вы подключаетесь к хосту в основном потоке, он будет блокировать поток, если я не запустил его в новом потоке, в отличие от Indy, где он фактически не зависает нитью, поэтому я принял его создает свою собственную нить. – deeznutz

+1

@deeznutz как клиенты Synapse, так и Indy TCP блокируются, метод Connect будет возвращаться при возникновении тайм-аута или установлении соединения – mjn

+0

@deeznutz в Indy, 'Connect()' * не * работает в отдельном потоке, он * делает * блокировать вызывающий поток. Если это основной поток пользовательского интерфейса, пользовательский интерфейс будет заморожен, если вы не используете компонент 'TIdAntiFreeze', чтобы позволить сообщениям продолжать обрабатываться, когда основной цикл сообщения заблокирован. –