2013-03-27 63 views
16

我是Haskell的全新工具,我試圖弄清楚如何計劃一個回調從現在開始(並且不早)X秒內被觸發。在Haskell中計劃超時

在搜索Hoogle和谷歌,我發現:

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

還有:

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

這兩設有 「registerTimeout」 功能,似乎做我想要的是。但是,System.Event似乎不再處於Haskell的最新版本中,GHC.Event被標記爲內部版本。

是否有一些用戶空間替代我可以使用?我不希望使用GLUT的計時函數(除非這是實現我的目標的規定方式),並且System.Timeout看起來並不完全符合我的要求;它的目的是最大限度地減少可能花費的時間而不是最小的時間。

謝謝您的意見!

回答

19

我會在延遲後簡單地在自己的線程上執行回調。這是一個GHC主題。

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) 

GHC中的線程特別輕巧,所以這不會佔用系統資源。

+1

這很有道理!非常感謝。我一直在迴避線程,因爲我認爲它們產生/加入的代價很高。我很好奇看到有多少這些我可以一次坐在一個進程中,而沒有消耗內存成爲一個大問題。時間開始基準測試。 – zslayton 2013-03-27 23:55:07

+3

@Zack:不要擔心開銷,它很小。請參閱:http://stackoverflow.com/questions/5847642/haskell-lightweight-threads-overhead-and-use-on-multicores – 2013-03-28 00:31:10

+0

哇,就這樣。我真的開始喜歡這個Haskell業務。 – zslayton 2013-03-28 14:23:43