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 |
а у второго ошибка. |
а что за ошибка-то?
Эмм...насколько я помню, там для каждого коннекта, создается свой поток. Когда писал такую штуку, в каждом потоке создавал свой адоконнекшен, и никаких проблем с одновременной работой не было.
Лучше опишите, как прога с БД общается, похоже проблемы оттуда растут.
intbatt
Дата: 11.06.2009 10:28:22
Leo Pevzner |
Лучше опишите, как прога с БД общается, похоже проблемы оттуда растут. |
Лежит в датамодуле 1 общий АДОКоннекшен.
И на каждую команду свой АДОКвери с ДатаСурсом.
Сервер получает команду, этой команде ассоциирован СКЛ запрос, этот запрос подставляется в ассоциированный с командой АДОКвери и екзекутится.
Альт
Дата: 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 квери на все команды. Или я что-то не понял?