问题描述
使用OCaml图形模块时,我经常得到一个尺寸错误的窗口;这不是可预测的行为。显示的窗口始终具有所需的大小,但由于未知原因,OCaml有时会认为它实际上具有不同的大小,因此会影响图形。
也许与窗口系统有关;我正在OS X上使用X11(XQuartz)。
问题的证据
请考虑以下顺序:
28.0.3
预期结果是一个大小恒定为500x500的窗口,即:
open Graphics
let f () =
Printf.printf "size_x = %d, size_y = %d\n" (size_x ()) (size_y ())
let () =
open_graph "";
resize_window 500 500;
f ();
Unix.sleepf 0.01
f ();
Unix.sleepf 0.1
f ()
但有时我(很有可能)得到
size_x = 500, size_y = 500
size_x = 500, size_y = 500
size_x = 500, size_y = 500
或
size_x = 500, size_y = 500
size_x = 600, size_y = 450
size_x = 500, size_y = 500
或
size_x = 600, size_y = 450
size_x = 500, size_y = 500
size_x = 500, size_y = 500
换句话说,这是一个可变行为,似乎在打开窗口后仅十分之几秒内就会发生。
无论我将选项size_x = 600, size_y = 450
size_x = 600, size_y = 450
size_x = 500, size_y = 500
和auto_synchronize
设置为真还是假,结果都是相同的。
解决方法
我确保至少在所有display_mode
指令之后紧跟resize_window
(或在Unix.sleepf 0.1
关闭的情况下紧跟synchronize (); Unix.sleepf 0.1
);当然,这不是一个非常令人满意的解决方案……