Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2014, 16:51   #1
tocsik
Пользователь
 
Регистрация: 09.09.2009
Сообщений: 39
По умолчанию Commands out of sync; you can't run this command now

Здравствуйте!
У меня две проблемы - кривые руки(о боже, моя архитектура такой треш, спасите меня) и "Commands out of sync; you can't run this command now". Не обязательно читать про каждую, я буду очень благодарен за помощь в любой проблеме.
Сначала необходимая для решения проблем информация, затем по каждой проблеме. Итак.
Я пишу игру, сетевую - в первый раз. Это пошаговая стратегия для трех человек. В процессе игры клиенты часто используют бд(то есть, обращаются через сокеты к серверу, а он уже делает запрос).
Первая проблема(моя ужасная архитектура):
Цитата:
Как я решил реализовать архитектуру: клиенты коннектятся к серверу, авторизуются, заходят в лобби. Для каждого клиента сервер создает поток(fork). Теперь пусть игра началась. Сейчас начнется треш
Игровую логику на сервере осуществляет поток, привязанный к одному из трех клиентов(тип он хост). Как хост передает информацию всем клиентам? Он записывает ее в таблицу бд, затем каждый из клиентов считывает из таблицы и ждет, пока считают все(там счетчик - количество прочитавших таблицу). О боже мой это гавно ведь будет жутко тормозить, сервер наверняка не потянет >100 человек. Помогите.
Вторая проблема:
Цитата:
Я полагаю, все из-за того, что сервер делает запросы к бд от разных пользователей параллельно и они как бы пересекаются. mysql_free_result запихал везде, где нужно. Сервер на c++, код полностью скинуть не могу - 1000 строк, но могу частично.
Очень надеюсь на помощь форумчан.
tocsik вне форума Ответить с цитированием
Старый 12.08.2014, 17:03   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Сначала сделайте, чтоб сервер посылал клиенту напрямую, по соединению, то, что писал в базу.
Потом сделайте, чтоб клиент читал данные из сети, а не из базы.
Сервер пишет в базу + всем активным клиентам. Если кто подключится позднее - сервер берет из базы один раз и шлет новому клиенту по сети, а дальше он уже все получает автоматом.

Главный урок - сериализация данных.
waleri вне форума Ответить с цитированием
Старый 12.08.2014, 19:43   #3
tocsik
Пользователь
 
Регистрация: 09.09.2009
Сообщений: 39
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Сначала сделайте, чтоб сервер посылал клиенту напрямую, по соединению, то, что писал в базу.
У меня он через сокет и посылает. Что значит "напрямую"? И что значит "то, что писал в базу"? Вы дебаг-аутпут имеете ввиду?
Цитата:
Сообщение от waleri Посмотреть сообщение
Потом сделайте, чтоб клиент читал данные из сети, а не из базы.
Клиент итак читает из сети. С базой работает только сервер. По сокету сервер передает клиенту данные.
Цитата:
Сообщение от waleri Посмотреть сообщение
Сервер пишет в базу + всем активным клиентам.
А вот тут поподробнее. Сервер всем активным клиентам? Но у меня на каждого клиента по потоку(т.е. одного клиента обслуживает один, независимый экземпляр программы-сервера). Знаю, что это ужасно.
Цитата:
Сообщение от waleri Посмотреть сообщение
Если кто подключится позднее - сервер берет из базы один раз и шлет новому клиенту по сети, а дальше он уже все получает автоматом.
Автоматом? Видимо, я вас совсем не понял Опишите, пожалуйста, поподробнее. Спасибо.
tocsik вне форума Ответить с цитированием
Старый 12.08.2014, 20:12   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Я так понял, сервер пишет в базу а все клиенты из нее читают, разве нет?
waleri вне форума Ответить с цитированием
Старый 12.08.2014, 23:25   #5
tocsik
Пользователь
 
Регистрация: 09.09.2009
Сообщений: 39
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Я так понял, сервер пишет в базу а все клиенты из нее читают, разве нет?
Цитата:
В процессе игры клиенты часто используют бд(то есть, обращаются через сокеты к серверу, а он уже делает запрос).
Нет, это же небезопасно. Кажется, мы отошли от темы.
tocsik вне форума Ответить с цитированием
Старый 13.08.2014, 00:16   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ну не знаю, я прочитал вот это:
Цитата:
Он записывает ее в таблицу бд, затем каждый из клиентов считывает из таблицы и ждет, пока считают все(там счетчик - количество прочитавших таблицу).
Ладно, не суть важно. Идея в том, что клиентам нет смысля читать из базы, имеет смысл чтоб сервер сообщал о событии при наступлении оного. Например клиент 1 сообщает "я сделал то то и то то", сервер записывает в базу, для истории, а потом шлет всем подключенным клиентам уведомление о данном событии. Нагрузка на базу при таком подходе будет в разы меньше. Считывать из базы будет нужно только при первоначальном подключении клиента.
Да, для этого надо будет отказаться от fork а использовать select().

Последний раз редактировалось waleri; 13.08.2014 в 00:18.
waleri вне форума Ответить с цитированием
Старый 13.08.2014, 14:42   #7
tocsik
Пользователь
 
Регистрация: 09.09.2009
Сообщений: 39
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ну не знаю, я прочитал вот это:

Ладно, не суть важно. Идея в том, что клиентам нет смысля читать из базы, имеет смысл чтоб сервер сообщал о событии при наступлении оного. Например клиент 1 сообщает "я сделал то то и то то", сервер записывает в базу, для истории, а потом шлет всем подключенным клиентам уведомление о данном событии. Нагрузка на базу при таком подходе будет в разы меньше. Считывать из базы будет нужно только при первоначальном подключении клиента.
Да, для этого надо будет отказаться от fork а использовать select().
Ага, спасибо, это действительно намного быстрее. А что делать со второй проблемой, она основная? Пока ее не решу, не смогу продолжать разработку.
tocsik вне форума Ответить с цитированием
Старый 13.08.2014, 15:01   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А я не понял, в чем вторая проблема.
Там написано вероятная причина, но сама проблема не озвучена.
waleri вне форума Ответить с цитированием
Старый 13.08.2014, 20:07   #9
tocsik
Пользователь
 
Регистрация: 09.09.2009
Сообщений: 39
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А я не понял, в чем вторая проблема.
Там написано вероятная причина, но сама проблема не озвучена.
"Commands out of sync; you can't run this command now"
tocsik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Command: menuItem неактивен D][mon WPF, UWP, WinRT, XAML 1 22.01.2014 21:53
c# и ms sync framework - отслеживание заменяемых файлов до синхронизации Vygor C# (си шарп) 1 07.06.2012 18:03
sync Google Calendar with Emacs Pam Помощь студентам 0 06.11.2011 14:47
Zadacha po izmeneniu command Zmeiarm Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 22.12.2009 15:10