Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение и запись в разных потоках 
:(
    Опции темы
Sokolll
Дата 17.5.2007, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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. Объясните, пожалуйста,  как вообще работать со связками.
 Да и может быть лучше как-нибудь по-другому организовать чтение и запись в разных потоках.
PM MAIL   Вверх
MetalFan
Дата 18.5.2007, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



может пересмотреть структуру приложения и осуществлять чтение и запись в одном потоке? либо передавать idTCPClient в вспомогательный поток, но тогда надо обеспечить потокобезобасность при работе с общими данными(в частности с idTCPClient).


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Sokolll
Дата 18.5.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.4.2007

Репутация: 0
Всего: 0



У меня стоит задача - осуществить чтение и запись в разных потоках :(

Не подскажите, где можно найти какую-нибудь инфу по bindings. 
На клиенте делаю так:
Код


  begin
   SoCket.BoundIP:='localhost';
   Socket.BoundPort:=1050;
   SoCket.Binding.Bind;
   try
      Connect;
    except
      on E: Exception do
      begin
        ShowMessage('An Error occured while try to connect: '+E.Message);
        Exit;
      end;
    end;

 

Вылетает "Access violation". Подскажите, в чем ошибка?

PM MAIL   Вверх
MetalFan
Дата 18.5.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



а SoCket создан?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Sokolll
Дата 19.5.2007, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.4.2007

Репутация: 0
Всего: 0



Как я понимаю, когда я создаю IDTCPClient, socket тоже создается, а клиент у меня создан:

IdTCPClient:=TIdTCPClient.Create;
PM MAIL   Вверх
aktuba
Дата 19.5.2007, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 9
Всего: 38



Цитата

Как я понимаю, когда я создаю IDTCPClient, socket тоже создается, а клиент у меня создан:

IdTCPClient:=TIdTCPClient.Create; 


Я чего-т не допонял... А какое отношение имеет SoCket к IdTCPClient?


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Sokolll
Дата 19.5.2007, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.4.2007

Репутация: 0
Всего: 0



Цитата

Я чего-т не допонял... А какое отношение имеет SoCket к IdTCPClient?


Socket - это IDTCPClient.Socket

Я просто код не весь вставил:
Код

IDTCPClient:=TIdTCPClient.Create;
 with IdTCPClient do
 begin
   SoCket.BoundIP:='localhost';
   Socket.BoundPort:=1050;
   SoCket.Binding.Bind;
   try
      Connect;
    except
      on E: Exception do
      begin
        ShowMessage('An Error occured while try to connect: '+E.Message);
        Exit;
      end;
    end;
 end;



Добавлено через 6 минут и 18 секунд
А еще такой вопрос: 

Создаю IdTCPServer, ставлю обработчик OnExecute, в котором ничего не делаю. Подсоединяется клиент и все начинает тормозит, в диспетчере задач мой сервер юзает 99% ресурсов процессора, хотя ни сервер, ни клиент никакой информации не пишет\не читает. 
В чем прична?
PM MAIL   Вверх
MetalFan
Дата 19.5.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



что за изврат?
чем не устроило:
Код

  idTCPClient.Host := '...';
  idTCPClient.Port := ...;
  idTCPClient.Connect;

p.s. хоть бы хелп посмотрел.
св-ва BoundIP/BoundPort - это "исходящие" параметры клиента. 
а Host и Port - к чему подсоединяться

Это сообщение отредактировал(а) MetalFan - 19.5.2007, 11:49


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Sokolll
Дата 19.5.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.4.2007

Репутация: 0
Всего: 0



Спасибо. 
Но как связывать то bindings?  ато  Access violation  и все...?
PM MAIL   Вверх
MetalFan
Дата 19.5.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



Sokolll, на кой тебе дались эти bindings???
указываешь порт, хост. делаешь коннект. что надо то еще?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Sokolll
Дата 20.5.2007, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.4.2007

Репутация: 0
Всего: 0



Цитата

Sokolll, на кой тебе дались эти bindings???
указываешь порт, хост. делаешь коннект. что надо то еще?


Во-первых просто интересно, во-вторых, как писал, нужно организовать чтение и запись в разных потоках. А для того, чтобы определить на серере, в каком потоке надо писать, хотел использовать свойство 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 присваиваю указатель на контекст.
Все. Теперь, если надо что-то послать на клиентское приложение, пишу в этом контексте.

Получилось замудренно, но работаетsmile







PM MAIL   Вверх
MetalFan
Дата 22.5.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



Цитата(Sokolll @  20.5.2007,  19:42 Найти цитируемый пост)
При подключении на клиенте посылаю строку-идентификатор, состоящую из цифры 1 - для пишущего потока или цифры 2 - для читающего, и хэндла окна главной формы.

не самая хорошая идея использовать для идентификации клиента в сети хэндл формы приложения...
уж лучше раздавать ID при подключении сервером


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Sokolll
Дата 23.5.2007, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 8.4.2007

Репутация: 0
Всего: 0



Цитата

уж лучше раздавать ID при подключении сервером


Спасибо, так и сделал. Получилось проще и лучше.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.