module GtkThread:sig
..end
The main loop to use with threads. GMain.main
does not work!
This changes GMain.main
to call threaded_main
rather than
GtkMain.Main.default_main
, so subsequent calls will work.
The first call sets the GUI thread, and subsequent calls
to main
will be automatically routed through sync
.
With system threads, the ocaml giant lock is now released on
polling, so that other ocaml threads can run without busy wait.
val main : unit -> unit
Setting busy_waiting
to true
forces the main loop to be
non-blocking. This is required with VM threads.
The default value is set to true
at startup if the environment
variable LABLGTK_BUSY_WAIT
is set to something other than 0
.
val busy_waiting : bool Stdlib.ref
Start the main loop in a new GUI thread. Do not use recursively. Do not use with the Quartz backend, as the GUI must imperatively run in the main thread.
val start : unit -> Thread.t
The real main function
val thread_main : unit -> unit
Forget the current GUI thread. The next call to main
will register its caller as GUI thread.
val reset : unit -> unit
val async : ('a -> unit) -> 'a -> unit
Add an asynchronous job (to do in the main thread)
Add a synchronous job (to do in the main thread)
val sync : ('a -> 'b) -> 'a -> 'b
Whether it is safe to call most GTK functions directly from the current thread
val gui_safe : unit -> bool
Allow other threads to run, and process the message queue.
The following ensures that messages will be processed even
if another main loop is running:
Glib.Timeout.add ~ms:100 ~callback:GtkThread.do_jobs
val do_jobs : unit -> bool
val set_do_jobs_delay : float -> unit
Set the delay used in the main loop when busy_waiting
is true
.
Higher value will make the application less CPU-consuming,
but (relatively) less reactive.
Default value is 0.013
.