如何在用户输入时中断 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.0
和 diskuv-ocaml windows install
一起工作
input_line
操作系统中的函数阻塞,因此为了解除阻塞,您必须使用操作系统的相应功能,或者坚持使用非阻塞 IO。您绝对可以使用 Unix 模块来实现它,但是以一种可饮用的方式来实现它既困难又乏味。好消息是已经有人这样做了。 OCaml 中有很多解决方案,从使用非阻塞异步式 IO(如 Lwt 或 Async)开始,或者使用专门的类似 readline 的库。
我有一个程序可以无限期地为我的问题寻找最佳解决方案。我让用户决定它可以 运行 找到解决方案的时间,一旦用完这段时间,程序就会停止,创建一些日志文件,打印一些调试数据并显示找到的最佳解决方案。
现在,如果用户不想等到结束,我想通过在终端中提示一些消息来允许用户提前停止程序。
由于
理想情况下,我会有 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.0
和 diskuv-ocaml windows install
input_line
操作系统中的函数阻塞,因此为了解除阻塞,您必须使用操作系统的相应功能,或者坚持使用非阻塞 IO。您绝对可以使用 Unix 模块来实现它,但是以一种可饮用的方式来实现它既困难又乏味。好消息是已经有人这样做了。 OCaml 中有很多解决方案,从使用非阻塞异步式 IO(如 Lwt 或 Async)开始,或者使用专门的类似 readline 的库。