caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* Unix.sleep et bibliothèque graphique
@ 2000-11-09  6:38 Laure Danthony
  2000-11-10  9:05 ` Sven LUTHER
  2000-11-10 12:47 ` Xavier Leroy
  0 siblings, 2 replies; 3+ messages in thread
From: Laure Danthony @ 2000-11-09  6:38 UTC (permalink / raw)
  To: caml-list

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 4499 bytes --]

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



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Unix.sleep et bibliothèque graphique
  2000-11-09  6:38 Unix.sleep et bibliothèque graphique Laure Danthony
@ 2000-11-10  9:05 ` Sven LUTHER
  2000-11-10 12:47 ` Xavier Leroy
  1 sibling, 0 replies; 3+ messages in thread
From: Sven LUTHER @ 2000-11-10  9:05 UTC (permalink / raw)
  To: Laure Danthony; +Cc: caml-list

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'ai
ecrit un 'wrapper' de la librairie Graphics qui produit un widget drawingarea
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 continuer
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



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Unix.sleep et bibliothèque graphique
  2000-11-09  6:38 Unix.sleep et bibliothèque graphique Laure Danthony
  2000-11-10  9:05 ` Sven LUTHER
@ 2000-11-10 12:47 ` Xavier Leroy
  1 sibling, 0 replies; 3+ messages in thread
From: Xavier Leroy @ 2000-11-10 12:47 UTC (permalink / raw)
  To: Laure Danthony, caml-list

[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



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2000-11-10 18:42 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-11-09  6:38 Unix.sleep et bibliothèque graphique Laure Danthony
2000-11-10  9:05 ` Sven LUTHER
2000-11-10 12:47 ` Xavier Leroy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).