![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| Sokolll |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.4.2007 Репутация: 0 Всего: 0 |
Использую IdTCPServer и IdTCPClient. Необходимо сделать, чтобы чтение и запись в сокет происходило в разных потоках и на клиенте и на сервере. Для этого на клиенте кидаю IdTCPClient на форму - через него пишу. Создаю поток, в нем создаю еще один IdTCPClient - через него читаю. Получается, что на сервере создаются два потока. Для того, чтобы можно было обратиться к потоку и через него писать пытаюсь использовать делаю следующим образом:
1)Соединяюсь с сервером из основоного потока клиентcкого приложения и из потока, через который собираюсь читать. 2) Из главного потока приложения отправляю серверу значение idTCPClient.Socket.Binding.ID - IdTCPClient-a из читающего потока. 3) На сервере в OnConnect для того, чтобы определить, в каком потоке нужно писать, перебираю ID соединений всех потоков: TIdContext(IdTCPServer.Contexts.LockList.Items[i]).Connection.Socket.Binidng.ID и сраниваю с принятым значением от клиента. Почему - то значение Binding.ID всегда = 0. Объясните, пожалуйста, как вообще работать со связками. Да и может быть лучше как-нибудь по-другому организовать чтение и запись в разных потоках. |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
может пересмотреть структуру приложения и осуществлять чтение и запись в одном потоке? либо передавать idTCPClient в вспомогательный поток, но тогда надо обеспечить потокобезобасность при работе с общими данными(в частности с idTCPClient).
-------------------- There are always someone smarter than you... |
|||
|
||||
| Sokolll |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.4.2007 Репутация: 0 Всего: 0 |
У меня стоит задача - осуществить чтение и запись в разных потоках :(
Не подскажите, где можно найти какую-нибудь инфу по bindings. На клиенте делаю так:
Вылетает "Access violation". Подскажите, в чем ошибка? |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
а SoCket создан?
-------------------- There are always someone smarter than you... |
|||
|
||||
| Sokolll |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.4.2007 Репутация: 0 Всего: 0 |
Как я понимаю, когда я создаю IDTCPClient, socket тоже создается, а клиент у меня создан:
IdTCPClient:=TIdTCPClient.Create; |
|||
|
||||
| aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 9 Всего: 38 |
Я чего-т не допонял... А какое отношение имеет SoCket к IdTCPClient? -------------------- ![]() |
|||
|
||||
| Sokolll |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.4.2007 Репутация: 0 Всего: 0 |
Socket - это IDTCPClient.Socket Я просто код не весь вставил:
Добавлено через 6 минут и 18 секунд А еще такой вопрос: Создаю IdTCPServer, ставлю обработчик OnExecute, в котором ничего не делаю. Подсоединяется клиент и все начинает тормозит, в диспетчере задач мой сервер юзает 99% ресурсов процессора, хотя ни сервер, ни клиент никакой информации не пишет\не читает. В чем прична? |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
что за изврат?
чем не устроило:
p.s. хоть бы хелп посмотрел. св-ва BoundIP/BoundPort - это "исходящие" параметры клиента. а Host и Port - к чему подсоединяться Это сообщение отредактировал(а) MetalFan - 19.5.2007, 11:49 -------------------- There are always someone smarter than you... |
|||
|
||||
| Sokolll |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.4.2007 Репутация: 0 Всего: 0 |
Спасибо.
Но как связывать то bindings? ато Access violation и все...? |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
Sokolll, на кой тебе дались эти bindings???
указываешь порт, хост. делаешь коннект. что надо то еще? -------------------- There are always someone smarter than you... |
|||
|
||||
| Sokolll |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.4.2007 Репутация: 0 Всего: 0 |
Во-первых просто интересно, во-вторых, как писал, нужно организовать чтение и запись в разных потоках. А для того, чтобы определить на серере, в каком потоке надо писать, хотел использовать свойство bindings.ID, ведь как, я понимаю, его значение должно быть одинаковым и на клиенте и на сервере. Так как с Bindings ничего не получилось, сделал так: На клиенте сначала подключаюсь из читающего потока, затем из основного потока приложения. При подключении на клиенте посылаю строку-идентификатор, состоящую из цифры 1 - для пишущего потока или цифры 2 - для читающего, и хэндла окна главной формы. На сервере при подключении клиента читаю строку-идентификатор и присваиваю ее значению Connection.Tag. Дальше проверяю, если 1-ый символ строки = '2' - значит это соединение с IdTCPCLient-ом чиатющего потока клиентского приложения - Exit; Если '1' - значит это соедиенение с IdTCPClient-ом пишущего потока клиентсокого приложения и далее делаю следующее: Надо определить в каком потоке писать (в потоке с Connection.Tag = '2......'). Перебираю Connection.Tag всех контекстов IdTCPServer-а - сравниваю Tag cо строкой: AContext.Connection.Tag только первый символ = '2'. При совпадении в переменную типа Pointer присваиваю указатель на контекст. Все. Теперь, если надо что-то послать на клиентское приложение, пишу в этом контексте. Получилось замудренно, но работает |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
не самая хорошая идея использовать для идентификации клиента в сети хэндл формы приложения... уж лучше раздавать ID при подключении сервером -------------------- There are always someone smarter than you... |
|||
|
||||
| Sokolll |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 8.4.2007 Репутация: 0 Всего: 0 |
Спасибо, так и сделал. Получилось проще и лучше. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |