我想做一个能让暂停时间少于1秒的函数。所以我做了这个函数:
let pause(n:float)=
Unix.select [] [] [] n
;;我这样使用它:
ignore(pause(0.1));顶层给我返回了这个错误:
Exception: Unix.Unix_error (Unix.EINTR, "select", "").我该怎么做?
附注:我也尝试过使用Thread.delay,但我也遇到了同样的错误。
发布于 2018-12-14 22:49:51
这意味着在调用select期间向您的程序发送了一个信号。
假设您使用的是OCaml 4.03或更高版本,您可以使用Unix.sleepf函数,它可以执行您所期望的操作:
# Unix.sleepf;;
- : float -> unit = <fun>在旧版本的OCaml上,您可以使用setitimer函数,这将需要一些信号处理:
exception Alarm
let () = Sys.set_signal Sys.sigalrm ( Sys.Signal_handle (fun _ -> raise Alarm) )
let pause f =
let _ = Unix.setitimer Unix.ITIMER_REAL
{ Unix.it_interval = 0.; Unix.it_value = f; } in
try Unix.sleep (int_of_float (ceil f)) with
| Alarm -> ()请注意,这并不是真正的线程安全,并且会与SIGALRM的其他使用冲突。我强烈建议您切换到最新版本的OCaml。
https://stackoverflow.com/questions/53781533
复制相似问题