Описание проблемы
При использовании графического модуля OCaml я часто получаю окно с неправильным размером;и это не предсказуемое поведение.Отображаемое окно всегда имеет требуемый размер, но по неизвестной причине OCaml иногда считает, что оно на самом деле имеет другой размер, и, следовательно, это влияет на чертеж.
Возможно, это связано с оконной системой;Я использую X11 (XQuartz) на OS X.
Доказательства проблемы
Рассмотрим следующую последовательность:
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 ()
Ожидаемый результатэто окно постоянного размера 500x500, то есть:
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
true или false.
Обходное решение
Я проверяю, что все resize_window
инструкции выполняются как минимум Unix.sleepf 0.1
(илина synchronize (); Unix.sleepf 0.1
, когда auto_synchronize
выключен);конечно, это не очень удовлетворительное решение ...