Zbudowałem grę dla wielu graczy (dokładnie dla 4 graczy) za pomocą konstrukcji przekazującej wiadomość erlang. Śledziłem grę tictactoe na poniższym linku jako przykład, ale to, co jest podobne, to konstrukcja przekazująca wiadomości, jak pokazano w grze:jak rozwiązać problem wyścigu między wywołaniami funkcji
Potem wybrałem tę grę na ejabberd Multi user Chatroom, napisałam hak ejabberd do tego. Ale jeśli spojrzysz na NewGameState w pliku tictactoe.erl na powyższym łączu, przekonasz się, że nie ma możliwości odzyskania go w zmiennej w postaci .
Więc użyłem mezji i napisałem każdy nowy gamestr wygenerowany do tego stołu mezji. Teraz Wewnątrz mojego haka ejabberd zgłoszę mojej funkcji gry (czyli na każdy wywołać szereg modułów -> „gen_server, game_modules, mnesia_modules” są wykonywane) i wewnątrz haka tuż pod wezwaniem funkcji gry Czytam z tabeli mnesia dla gamestate następująco (tu myMessage funkcją jest funkcja wewnątrz haka ejabberd):
myMessage({#message = Msg, C2SState})->
some_other_module:game_func(Args),
State=mnesia_module:read(key),
{Msg, C2SState};
myMessage(Acc) ->
Acc.
teraz moim problemem jest to, że operacja odczytu daje mi pusty stolik, kiedy kolejność wykonywania jest
some_other_module:game_func(Args),
GameState=mnesia_module:read(key),
i kiedy wstawię opóźnienie między tymi dwoma wierszami jako timer:sleep/1
jako b elow (wartość 200 jest wybierany losowo po pewnym badaniu z różnymi wartościami):
some_other_module:game_func(Args),
timer:sleep(200)
GameState=mnesia_module:read(key),
jestem coraz poprawną wartość GameState co sugeruje mi, że operacja odczytu zgodne
GameState=mnesia_module:read(key),
odbywa się coraz/wykonywane przed linią some_other_module:game_func(Args)
(która jest serią modułów -> "gen_server, game_modules, mnesia_modules") jest w stanie wykonać moduły mnesia i zapisać GameState w tabeli mnesia.
Jak mogę rozwiązać ten problem, ponieważ nie chcę używać timer:sleep/1
, ponieważ nie jest to niezawodne rozwiązanie.
Czy ktoś może zaproponować mi pracę tutaj. Co mam na myśli, to czy ktoś może zaproponować mi sposób na odzyskanie GameState wewnątrz haczyka w inny sposób niż mezji, więc nie mam w ogóle stanu wyścigu.
Albo jest jakiś sposób, że ejabberd zapewnia jakąś funkcjonalność, której mogę użyć tutaj?
Z góry dziękuję.
Czy używasz mnesii: dirty_ * funkcji? – Pouriya
no @Pouriya Używam mnesia: write/1 do zapisu danych, podczas gdy some_other_module: game_func (Args) jest uruchomiona, a mnesia: read/3 do odczytu danych po wywołaniu GameState = mnesia_module: read (key). –
Czy możesz pokazać kod? – Pouriya