2013-03-27 23 views
16

Jestem nowy dla Haskella i staram się wymyślić, jak zaplanować oddzwonienie do zwolnienia X sekund od teraz (i nie wcześniej).Planowanie limitu czasu w Haskell

W poszukiwaniu Hoogle i Google, odkryłem:

http://www.haskell.org/ghc/docs/latest/html/libraries/base/GHC-Event.html

, jak:

http://hackage.haskell.org/packages/archive/base/4.3.1.0/doc/html/System-Event.html

Oba wyposażone są w funkcję "registerTimeout", który wydaje się zrobić czego chcę. Jednak wydaje się, że System.Event nie jest już w najnowszych kompilacjach Haskella, a GHC.Event jest oznaczony jako wewnętrzny.

Czy mogę użyć jakiegoś substytutu przestrzeni użytkownika? Wolałbym nie używać funkcji czasowych przeznaczonych dla GLUT (chyba że jest to określony sposób osiągnięcia mojego celu), a System.Timeout nie wydaje się całkiem tym, czego chcę; ma on na celu maksymalne określenie czasu, który może zająć raczej niż minimum.

Dziękujemy za wiadomość!

Odpowiedz

19

Po prostu wykonam wywołanie zwrotne we własnym wątku po opóźnieniu. To jest GHC-ism.

import Control.Concurrent (forkIO, threadDelay) 

-- | Run the callback after the given number of milliseconds. 
runAfterDelay :: Int -> IO() -> IO() 
runAfterDelay t f = forkIO (threadDelay t >> f) 

Wątki w GHC są wyjątkowo lekkie, więc nie trzeba wiązać zasobów systemowych.

+1

To ma sens! Dziękuję bardzo. Unikałem wątków, ponieważ postrzegałem je jako drogie do odrodzenia się/dołączenia. Jestem ciekawy, jak wiele z nich mogę mieć siedząc w procesie na raz, bez konsumpcji pamięci staje się ogromnym problemem. Czas rozpocząć analizę porównawczą. – zslayton

+3

@Zack: Nie martw się o obciążenie, jest bardzo mały. Zobacz: http://stackoverflow.com/questions/5847642/haskell-lightweight-threads-overhead-and-use-on-multicores –

+0

Whoa, tak jest. Naprawdę zaczynam lubić ten biznes Haskella. – zslayton