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

Timer 使用OCamlSDL(SDL2)等待关键字和计时器事件,timer,event-handling,ocaml,keyboard-events,sdl-2,Timer,Event Handling,Ocaml,Keyboard Events,Sdl 2,我需要能够使用OCamlSDL在应用程序中等待两种类型的事件: 用户按键 具有固定时间间隔的计时器事件 我可以在教程中看到如何在循环中等待事件。我的想法是使用SDL\u AddTimer设置计时器,并通过它提供自定义USER事件,这些事件将在与键盘事件相同的循环中处理。但是,我没有看到SDL\u AddTimerSDL函数的OCAML绑定。如何实现这样的功能?我找到的解决方案涉及运行单独的POSIX线程,该线程使用Sldevent.add发送用户定义的事件,然后在主事件处理循环中使用键盘事件处理

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

  • 用户按键
  • 具有固定时间间隔的计时器事件

  • 我可以在教程中看到如何在循环中等待事件。我的想法是使用
    SDL\u AddTimer
    设置计时器,并通过它提供自定义
    USER
    事件,这些事件将在与键盘事件相同的循环中处理。但是,我没有看到
    SDL\u 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 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
    

    如果你能找到一种集成lwt的方法,就有lwt_engine.on_timer,虽然我不确定SDL将如何工作。我猜您必须自己从
    Sdltimer
    Sdlevent.add
    中的函数来完成。我在Sdltimer模块中没有看到合适的函数:LWT提供协作线程,因为SDL不使用它们,所以它们可能无法在这里工作。我正在考虑的另一个选项是在OCaml中创建一个POSIX线程(使用线程模块),并通过
    Sdlevent.add
    提供计时器事件。
    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