Я построил многопользовательскую игру (точнее, 4 игрока), используя конструкцию передачи сообщений erlang. Я следил за игрой tictactoe по следующей ссылке в качестве примера, но что действительно похоже, так это конструкция передачи сообщений, как показано в игре: ссылка
Затем я решил запустить эту игру в многопользовательском чате ejabberd, я написал для этого хук ejabberd. Но если вы посмотрите на NewGameState в файле tictactoe.erl по приведенной выше ссылке, вы обнаружите, что нет никакого способа получить его в переменной.
Поэтому я использовал mnesia и записывал каждое новое игровое состояние, сгенерированное в эту mnesia-таблицу. Теперь внутри моего хука ejabberd я вызываю свою игровую функцию (т.е. при каждом вызове выполняется ряд модулей -> «gen_server, game_modules,mnesia_modules»), а внутри хука чуть ниже вызова игровой функции я читаю из таблицы mnesia для состояние игры выглядит следующим образом (здесь функция myMessage является функцией внутри хука ejabberd):
myMessage({#message = Msg, C2SState})->
some_other_module:game_func(Args),
State=mnesia_module:read(key),
{Msg, C2SState};
myMessage(Acc) ->
Acc.
Теперь моя проблема в том, что операция чтения дает мне пустую таблицу, когда порядок выполнения
some_other_module:game_func(Args),
GameState=mnesia_module:read(key),
и когда я вставляю задержку между этими двумя строками как timer:sleep/1
, как показано ниже (значение 200 выбирается случайным образом после некоторого испытания с разными значениями):
some_other_module:game_func(Args),
timer:sleep(200)
GameState=mnesia_module:read(key),
Я получаю правильное значение GameState, что говорит мне о том, что операция чтения в строке
GameState=mnesia_module:read(key),
выполняется/выполняется до того, как строка some_other_module:game_func(Args)
(которая представляет собой серию модулей -> "gen_server, game_modules,mnesia_modules") сможет выполнить модули mnesia и записать GameState в таблицу mnesia.
Как я могу решить эту проблему, поскольку я не хочу использовать timer:sleep/1
, так как это ненадежное решение.
Может ли кто-нибудь предложить мне работу здесь. Я имею в виду, может ли кто-нибудь предложить мне способ получить GameState внутри хука любым другим способом, кроме mnesia, чтобы у меня вообще не было состояния гонки.
Или есть какой-то способ, которым ejabberd предоставляет некоторые функции, которые я могу здесь использовать?
Заранее спасибо.
NewgameState
, после чего я вызываю mnesia:write/1 и сохраняю его с текущим Идентификатор игрока в качестве ключа. - person abhishek ranjan   schedule 11.08.2017