From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id TAA16730 for caml-red; Fri, 10 Nov 2000 19:42:38 +0100 (MET) Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id NAA28965 for ; Fri, 10 Nov 2000 13:47:17 +0100 (MET) Received: from pauillac.inria.fr (pauillac.inria.fr [128.93.11.35]) by concorde.inria.fr (8.11.1/8.10.0) with ESMTP id eAAClEH25550; Fri, 10 Nov 2000 13:47:14 +0100 (MET) Received: (from xleroy@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id NAA11272; Fri, 10 Nov 2000 13:47:14 +0100 (MET) Message-ID: <20001110134714.31102@pauillac.inria.fr> Date: Fri, 10 Nov 2000 13:47:14 +0100 From: Xavier Leroy To: Laure Danthony , caml-list@inria.fr Subject: Re: =?iso-8859-1?Q?Unix=2Esleep_et_biblioth=E8que_graphique?= References: <200011090638.HAA13067@babar.ens-lyon.fr> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Mailer: Mutt 0.89.1 In-Reply-To: <200011090638.HAA13067@babar.ens-lyon.fr>; from Laure Danthony on Thu, Nov 09, 2000 at 07:38:26AM +0100 Sender: weis@pauillac.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 gratte la tête un moment, mais voici une réimplémentation de Unix.sleep qui 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