gpt4 book ai didi

haskell - Haskell threadDelay 中的时间不准确

转载 作者:行者123 更新时间:2023-12-01 14:23:56 26 4
gpt4 key购买 nike

我想用 Haskell 的 printf 创造节奏。下面应该产生一种重复的节奏,其中一个音符的长度是另外两个音符的两倍。 (该节奏由列表 [1,1,2] 编码。)

import Control.Concurrent
import Text.Printf
import Control.Monad

main = mapM_ note (cycle [1,1,2])

beat = round (10^6 / 4) -- measured in miliseconds

note :: Int -> IO ()
note n = do
threadDelay $ beat * n
printf "\BEL\n"

当我运行它时,长音符听起来大约是其他音符的​​三倍,而不是两倍。如果我加快速度,将数字 4 更改为 10,节奏就会被完全破坏:所有音符的长度都相同。

是否可以更改刷新率?如果我想要精确计时,threadDelay 不是要使用的服务吗?

最佳答案

Is threadDelay not the service to use if I want precise timing?

不,not at all :

threadDelay :: Int -> IO () Source

Suspends the current thread for a given number of microseconds (GHC only).

There is no guarantee that the thread will be rescheduled promptly when the delay has expired, but the thread will never continue to run earlier than specified.

但是,在我的机器 (Win 8.1 x64 i5-3570k@3.4GHz) 上节奏运行良好。也就是说,\BEL 并不是创建节拍的好方法:

  1. \BEL 声音取决于操作系统(如果以该频率播放,在 Windows 8 中听起来很糟糕),
  2. 不清楚 \BEL 是否阻塞。

如果后者发生,你最终得到大致相同的长度,因为每个 \BEL 都会阻塞并且 threadDelay 比实际的 \BEL 声音。

关于haskell - Haskell threadDelay 中的时间不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26437770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com