나는 진드기 이벤트를 구현하려고하는데, 작동하지 않는다는 것을 보여주는 아래의 약간의 테스트가있다. 왜 그것이 작동하지 않는지에 대한 통찰력을 고맙게 생각합니다.Functional Banana Traveler - 틱 이벤트에 어떤 문제가 있습니까?
gameloop :: TChan UAC ->
IO()
gameloop commandChannel = do
(tickHandler, tickSink) <- newAddHandler
networkDescr <- compile $ makeNetworkDescription commandChannel tickHandler
actuate networkDescr
forkIO $ forever $ (timer 10) >>= tickSink
return()
makeNetworkDescription :: forall t . Frameworks t =>
TChan UAC ->
AddHandler() ->
Moment t()
makeNetworkDescription commandChannel tickHandler = do
eTick <- fromAddHandler tickHandler
bCChannel <- fromPoll $ grabCommands commandChannel
-- test fromPoll
test <- initial bCChannel
liftIO $ appendFile "testPoll.txt" $ show test
-- end fromPoll test
let eCChannel = bCChannel <@ eTick
liftIO $ print "hi there\n"
reactimate $ (\n -> appendFile "Commands.txt" (show n)) <$> eCChannel
grabCommands :: TChan UAC -> IO [UAC]
grabCommands unval = do
result <- (atomically $ readTChan unval) `untilM` (atomically $ isEmptyTChan unval)
liftIO $ print $ show result
return result
timer :: TimeOut -> IO()
timer ms = do
threadDelay ms
여기에 몇 가지 테스트 데이터가 있습니다. I 위 Main
을 실행할 때
main :: IO()
main = do
commandChan <- atomically $ newTChan :: IO (TChan UAC)
forkIO $ gameloop commandChan
liftIO $ print "back from fork\n"
atomically $ populateCC commandChan playerCommands
return()
populateCC :: TChan UAC -> [UAC] -> STM()
populateCC pChannel pCommands = mapM_ (writeTChan pChannel) pCommands
playerCommands =
[UAC (PlayerCommand (CommandData (T.pack "1" :: AID) Look) (T.pack "1")),
UAC (PlayerCommand (CommandData (T.pack "2" :: AID) (Move Mongo)) (T.pack "2"))
]
I는이 출력을 얻는다.
"back from fork\n"
"[UAC (PlayerCommand (CommandData \"1\" Look) \"1\"),UAC (PlayerCommand (CommandData \"2\" (Move Mongo)) \"2\")]"
"hi there\n"
파일 Commands.txt
는 결코 존재로 온다. 이 문제는 잘못된 틱 이벤트에 기인합니다.
this에서 타이머 구현에 대한 아이디어가 있지만 궁금한 점이 있는지 생각해보십시오. 어떤 아이디어?
편집 : 약간의 확신을 원했습니다. fromPoll
은 올바른 일을하고있었습니다. 위의 테스트를 추가했습니다.
이렇게하면 버퍼링 된 입력을 도입하는 방법에 대한 질문이 나옵니다. 이에 대해서는 곧 논의 할 것입니다. –
grabCommands가 어떻게 사라져야하는지 알고 있습니다. 그리고 accumE은 버퍼링 된 입력 문제를 해결하는 데 도움이 될 것이라고 생각합니다. –