Ocaml Pause Unix выбрать - PullRequest
       7

Ocaml Pause Unix выбрать

0 голосов
/ 14 декабря 2018

Я хочу сделать функцию, которая может сделать паузу менее 1 секунды.Итак, я сделал эту функцию:

let pause(n:float)=
Unix.select [] [] [] n
;;

И я использую это так:

ignore(pause(0.1));

И верхний уровень возвращает мне эту ошибку:

Exception: Unix.Unix_error (Unix.EINTR, "select", "").

Что я должен делать ?

PS Я также пытался с Thread.delay, но у меня та же ошибка.

1 Ответ

0 голосов
/ 14 декабря 2018

Это означает, что сигнал был отправлен вашей программе во время вызова на 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.

...