【发布时间】:2018-01-19 15:53:19
【问题描述】:
我已经使用 erlang 的消息传递构造构建了一个多人游戏(准确地说是 4 个玩家)。我以以下链接中的tictactoe游戏为例,但真正相似的是游戏中显示的消息传递构造:link
然后我选择在 ejabberd 多用户聊天室上运行这个游戏,我确实为此编写了一个 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有什么方法可以提供一些我可以在这里使用的功能?
提前致谢。
【问题讨论】:
-
你在使用 mnesia:dirty_* 函数吗?
-
no @Pouriya 我在 some_other_module:game_func(Args) 运行时使用 mnesia:write/1 写入数据,当 GameState=mnesia_module:read(键)被调用。
-
你能显示代码吗?
-
大部分代码与链接中给出的代码在同一行。不同的是,在链接中,在 tictactoe.erl 文件中,您会找到一个
NewgameState,之后我调用了 mnesia :write/1 并将其与当前玩家 id 作为键存储。
标签: erlang ejabberd erlang-shell ejabberd-module ejabberd-hooks