2013-03-27 13 views
16

Tôi là người mới sử dụng Haskell và tôi đang cố gắng tìm ra cách lên lịch cuộc gọi lại được kích hoạt X giây từ bây giờ (và không sớm hơn).Lập lịch thời gian chờ trong Haskell

Trong tìm kiếm Hoogle và Google, tôi đã phát hiện ra:

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

cũng như:

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

Cả hai tính năng một "registerTimeout" chức năng mà dường như làm những gì tôi muốn. Tuy nhiên, System.Event dường như không còn trong các phiên bản mới nhất của Haskell và GHC.Event được đánh dấu là nội bộ.

Có một số thay thế không gian người dùng mà tôi có thể sử dụng không? Tôi không muốn sử dụng các chức năng thời gian dành cho GLUT (trừ khi đó là cách quy định để đạt được mục tiêu của tôi), và System.Timeout không xuất hiện với những gì tôi muốn; nó được thiết kế để đặt tối đa số lượng thời gian mà một cái gì đó có thể thay vì tối thiểu.

Cảm ơn bạn đã nhập!

Trả lời

19

Tôi chỉ cần thực hiện cuộc gọi lại trên chuỗi của chính nó sau khi trì hoãn. Đây là một 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) 

Chủ đề trong GHC đặc biệt có trọng lượng nhẹ, vì vậy điều này sẽ không liên kết tài nguyên hệ thống.

+1

Điều đó có ý nghĩa! Cảm ơn rất nhiều. Tôi đã tránh được các chủ đề vì tôi nhận thấy chúng là đắt tiền để sinh sản/tham gia. Tôi tò mò muốn xem có bao nhiêu trong số này tôi có thể ngồi trong một quá trình cùng một lúc mà không tiêu thụ bộ nhớ trở thành một vấn đề lớn. Đã đến lúc bắt đầu điểm chuẩn. – zslayton

+3

@Zack: Đừng lo lắng về chi phí, nó rất nhỏ. Xem: http://stackoverflow.com/questions/5847642/haskell-lightweight-threads-overhead-and-use-on-multicores –

+0

Whoa, vậy là xong. Tôi thực sự bắt đầu thích kinh doanh Haskell này. – zslayton