使用 OCamlSDL (SDL2) 等待关键字和计时器事件

Waiting for both keyword and timer events with OCamlSDL (SDL2)

我需要能够在使用 OCamlSDL 的应用程序中等待两种类型的事件:

  1. 用户按键
  2. 具有固定时间间隔的定时器事件

我可以在教程中看到如何在循环中等待事件。我的想法是使用 SDL_AddTimer 设置一个计时器并通过它提供自定义 USER 事件,这些事件将在与键盘事件相同的循环中处理。但是我没有看到 SDL_AddTimer SDL 函数的 OCAML 绑定。我怎样才能实现这样的东西?

我找到的解决方案涉及 运行 单独的 POSIX 线程,该线程使用 Sldevent.add 发送用户定义的事件,然后在主事件处理循环中使用键盘事件进行处理。这是启动线程的代码:

...
and timer_cb () = Sdlevent.add [USER 0]  in
let timer_thread = Thread.create timer_loop (timer_flag, timer_cb) in
loop state; (* runs main program logic *)
timer_flag := true;
Thread.join timer_thread

定时器函数(在单独的线程中执行):

let rec timer_loop (flag, callback) =
  if !flag then
    Thread.exit
  else
    (Thread.delay 0.5;
     callback ();
     (timer_loop (flag, callback)))

事件处理循环除外:

let rec loop state =
   match wait_event () with
   | KEYDOWN {keysym=KEY_LEFT} ->
      (* process left arrow key press here *)
      loop state
   | USER 0 ->
     (* Process ticks here *)
     loop state
   | KEYDOWN {keysym=KEY_ESCAPE} ->
     (* ESC to exit the app *)
     ()
   | _ ->
     loop state