我已经使用 erlang 的消息传递构造构建了一个多人游戏(准确地说是 4 个玩家)。我以以下链接上的 tictactoe 游戏为例,但真正相似的是游戏中显示的消息传递构造:link
然后我选择在 ejabberd Multi user Chatroom 上运行这个游戏,我确实为此编写了一个 ejabberd 钩子。但是,如果您查看上述链接中文件 tictactoe.erl 中的 NewGameState,您会发现无法在变量中检索它。
所以我使用了 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
它,因为它不是可靠的解决方案。
谁能建议我在这里解决一下。我的意思是,任何人都可以建议我一种方法来通过除 mnesia 以外的任何其他方式来检索钩子内的 GameState,所以我根本没有竞争条件。
或者,ejabberd 是否以某种方式提供了一些我可以在这里使用的功能?
提前致谢。