如何在用户输入时中断 ocaml 程序

How to interrupt ocaml program on user input

我有一个程序可以无限期地为我的问题寻找最佳解决方案。我让用户决定它可以 运行 找到解决方案的时间,一旦用完这段时间,程序就会停止,创建一些日志文件,打印一些调试数据并显示找到的最佳解决方案。

现在,如果用户不想等到结束,我想通过在终端中提示一些消息来允许用户提前停止程序。

由于 ,我在 python 中找到了如何做到这一点,并且正在考虑是否可以在 OCaml 中拥有相同的架构。

理想情况下,我会有 2 个线程:

(* ___ Main thread ___ *)
start_program_thread();
Printf.printf "prompt `kill` to stop the program%!";
let rec aux() = match input_line() with 
  | "kill" -> (* user_didnt_stop set to false *)
  | _ -> aux()
in aux()


(* __________________________ *)


(* ___ Program thread ___ *)
while user_didnt_stop && Sys.time() -. start_time < max_time do
 (* search for optimal solution *)
done;
create_log_files();
send_debug_datas();
show_best_solution()

这可以用 the Thread lib 实现吗?

是否可以允许 program thread 在不破坏主程序的情况下打印内容?

我正在与 OCaml 4.12.0diskuv-ocaml windows install

一起工作

input_line 操作系统中的函数阻塞,因此为了解除阻塞,您必须使用操作系统的相应功能,或者坚持使用非阻塞 IO。您绝对可以使用 Unix 模块来实现它,但是以一种可饮用的方式来实现它既困难又乏味。好消息是已经有人这样做了。 OCaml 中有很多解决方案,从使用非阻塞异步式 IO(如 Lwt 或 Async)开始,或者使用专门的类似 readline 的库。