Indy - параллельное выполнение команд

intbatt
Дата: 11.06.2009 09:14:18
Уважаемые форумчане, вопросик к вам есть!

Пишутся 2 утилитки, одна сервер 2-я клиент с использованием Инди (IdTCPClient и IdTCPServer)
Сервер нужен для приема команд от клиента и поиска значения в БД в соответствии с принятотй командой от клиента.
Существует определенный фиксированный набор команд в количестве например 5 штук.
Пусть одна из них 'QQQ'.
Клиент шлет команду серверу, сервер ее принимает, ищет в БД значение и шлет его клиенту.
Клиент отсылает команду при помощи SendCmd (например SendCmd('QQQ', 200);)
На сервере созданы соответствующие командам CommandHandlers и у каждого из них команда обрабатывается по OnCommand.
Т.е сервер получил QQQ, поискал в базе, нашел, отослал клиенту. Клиент получил вывел в поле значение. Все вроде бы ок, НО!
Как сделать, чтобы можно было безболезненно нажимать кнопку с командой QQQ одновременно/почти одновременно (сервер порлучил команду QQQ от одного клиента, начал поиск данных и еще не успел отправить ответ клиенту, как получил QQQ от 2-го клиента) на 2-х клиентах - у меня сейчас в таком случае, кто раньше нажал, тот и получил ответ, а у второго ошибка.
Точно также если и с одного клиента посылать практически одновременно команду за командой. Если послать одну и дождаться ответа, то все ок, а если друг за другом, то также неполучается.
Как быть в этих случаях? Использовать на клиенте WriteStrings для отправки и NoCommandHandler на сервере для приема?

Заранее спасибо!
Leo Pevzner
Дата: 11.06.2009 10:10:55
intbatt
а у второго ошибка.

а что за ошибка-то?

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

Лучше опишите, как прога с БД общается, похоже проблемы оттуда растут.
MaratIsk
Дата: 11.06.2009 10:21:02
midware на overbyte.be
intbatt
Дата: 11.06.2009 10:28:22
Leo Pevzner

Лучше опишите, как прога с БД общается, похоже проблемы оттуда растут.


Лежит в датамодуле 1 общий АДОКоннекшен.
И на каждую команду свой АДОКвери с ДатаСурсом.

Сервер получает команду, этой команде ассоциирован СКЛ запрос, этот запрос подставляется в ассоциированный с командой АДОКвери и екзекутится.
Leo Pevzner
Дата: 11.06.2009 10:39:06
intbatt,

Осталось еще ошибку огласить и версию инди...
intbatt
Дата: 11.06.2009 11:31:58
Версия Инди та, которая идет в стандартной поставке с Делфи 7 - версия 9.00.10

Одна из ошибок это "connection closed gracefully"
Anatoly Podgoretsky
Дата: 11.06.2009 11:35:29
Это не ошибка

--
http://www.podgoretsky.com
Альт
Дата: 11.06.2009 11:37:46
А чего тут озвучивать... это девятка...
1. ставьте десятую
2. пользуйтесь TIdCmdTCPServer
3. из разных потоков обращаться к базе через общее соединение для разных "квери" нельзя (заводите или на каждый поток отдельное соединение или одно соединение и один квери обрабатывающий очередь запросов от разных потоков)
intbatt
Дата: 11.06.2009 11:43:54
Альт
А чего тут озвучивать... это девятка...
1. ставьте десятую
2. пользуйтесь TIdCmdTCPServer


Можно конечно 10-ю поставить на 7-ю делфю или перейти на делфю повыше, где она уже есть, но приложение уже написано практически, и переписывать бы не хотелось.

Альт

3. из разных потоков обращаться к базе через общее соединение для разных "квери" нельзя (заводите или на каждый поток отдельное соединение)


т.е на каждую команду создавать динамически АДОКоннекшен и Квери и далее выборку делать?

Альт

или одно соединение и один квери обрабатывающий очередь запросов от разных потоков)


Если так, то получается будет еще хуже? Сейчас то хоть 1 квери на каждую команду, а тут 1 квери на все команды. Или я что-то не понял?
intbatt
Дата: 11.06.2009 11:47:00
Anatoly Podgoretsky
Это не ошибка

--
http://www.podgoretsky.com


В смысле? А что это?
Я понимаю что сказано что соединение успешно закрыто,но почему оно то есть то нет его? понимаю что обработать его можно.