Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Unix.sleep et bibliothèque graphique

10 views
Skip to first unread message

Laure Danthony

unread,
Nov 9, 2000, 3:00:00 AM11/9/00
to caml...@inria.fr
suite à quelques essais infructeux et de discussions, voici un résumé du pb :
il s'agit de mettre des pauses au milieu de programmes graphiques qui s'éxécutent trop vite

(*mail de Luc Bougé*)

let n = ref 0 in while (not (key_pressed())) do (lineto !n
!n; n := !n + 1) done;;

Ca marche, mais il faut que la fenetre graphique soit
activee (par exemple en
pointant dessus).


J'ai fait quelques essais avec sleep. Je produis d'abord un
toplevel par##

ocamlmktop -o myocaml graphics.cma unix.cma

1) Le programme suivant marche bien.

open Graphics;;
open Unix;;

while true do
print_float (time());
print_newline();
Unix.sleep 2;
done
;;

2) Par contre, si j'ajoute open_graph "", cela
ne marche plus.

open Graphics;;
open Unix;;

open_graph "";;

while true do
print_float (time());
print_newline();
Unix.sleep 2;
done
;;

et la precedente version ne marche plus non plus, meme si je
tue la fenetre...

Je pense qu'il y a un probleme de compatibilite entre les
deux
bibliotheques, car la gestion graphique utilise des threads,
et
il y a une autre fonction "thread" dans cette bibliotheque.open Graphics;;
open Unix;;

open_graph "";;

while true do
print_float (time());
print_newline();
Unix.sleep 2;
done
;;

et la precedente version ne marche plus non plus, meme si je
tue la fenetre...

Je pense qu'il y a un probleme de compatibilite entre les
deux
bibliotheques, car la gestion graphique utilise des threads,
et
il y a une autre fonction "thread" dans cette bibliotheque.

(*fin*)

qu'en pensez vous ? Avez vous une solution ?

Merci de votre collaboration, Laure


Sven LUTHER

unread,
Nov 10, 2000, 3:00:00 AM11/10/00
to Laure Danthony
On Thu, Nov 09, 2000 at 07:38:26AM +0100, Laure Danthony wrote:
> qu'en pensez vous ? Avez vous une solution ?

Je ne suis pas entierement sur que cela te sera utile, mais il me semble =
que
tu pourrait tres bien utiliser une librairie graphique tel que mlgtk. J'a=
i
ecrit un 'wrapper' de la librairie Graphics qui produit un widget drawing=
area
dans mlgtk, et permet donc de reutiliser tous les programmes ecris pour
Graphics dans une interface graphique plus evolue. Le 'wrapper' n'est pas
encore complet, mais contient deja bien des choses, et je serait de conti=
nuer
a le developper si quelqu'un a besoin des fonctionalites manquantes.

Une 'traduction' du module pour lablgtk est egalement envisageable, en
attendant une unification des deux bibliothèques.

Amicalement,

Sven Luther


Xavier Leroy

unread,
Nov 10, 2000, 3:00:00 AM11/10/00
to Laure Danthony, caml...@inria.fr
[English summary: Laure observed that Unix.sleep returns early when
the graphics window is open. Under Unix, the graphics library uses
signals for event processing, and on many Unix systems, Unix.sleep
returns early when interrupted by a signal. Here is an alternate
implementation of sleep that is robust against signals.]

> suite à quelques essais infructeux et de discussions, voici un
> résumé du pb : il s'agit de mettre des pauses au milieu de
> programmes graphiques qui s'éxécutent trop vite

> 1) Le programme suivant [avec Unix.sleep] marche bien.


> 2) Par contre, si j'ajoute open_graph "", cela
> ne marche plus.

Oui, sur certains systèmes Unix, la fonction Unix.sleep retourne dès
que le processus reçoit un signal, sans attendre la fin du délai
prescrit. Or, il se trouve que la bibliothèque Graphics utilise des
signaux (pour traiter les événements X de manière asynchrone).

Ce problème n'est pas facile à contourner, il a fallu que je me gratt=
e
la tête un moment, mais voici une réimplémentation de Unix.sleep qu=
i
ne présente pas cet inconvénient:

let mysleep n =
let start = Unix.gettimeofday() in
let rec delay t =
try
ignore (Unix.select [] [] [] t)
with Unix.Unix_error(Unix.EINTR, _, _) ->
let now = Unix.gettimeofday() in
let remaining = start +. n -. now in
if remaining > 0.0 then delay remaining in
delay n

Attention, le paramètre de délai est un flottant, non un entier, ce
qui permet aussi de suspendre le programme pour moins d'une seconde.

Essayez, cela devrait marcher dans un programme utilisant Graphics.

- Xavier Leroy


0 new messages