Utilisation d'un timer dans un layout | |
Didier | 1-Jul-2008/22:50:13+2:00 |
Bonjour, j'ai un problème pour faire initialiser un timer et rafraichir les deux images ( voir dans le prog ) sev1_img: make image! [40x40 0.0.0.255] sev2_img: make image! [40x40 0.0.0.255] draw sev1_img [ pen coal fill-pen linear 0x0 0 44 89 1 1 silver red coal box 8.0 0x0 39x39 ] draw sev2_img [ pen coal fill-pen linear 0x0 0 44 89 1 1 silver orange coal box 8.0 0x0 39x39 ] window: center-face layout/size [ style text text font [name: "Tahoma" size: 9] backcolor white across at 35x65 pad 1 text "Version : 0.0.0.1" blue ;; je souhaite que ces 2 images ( sev1_img et sev2_img ) soient rafraichies toutes les 10 secondes at 10x25 image sev1_img (0) at 70x25 image sev2_img (0) ] 130x80 window/edge: make face/edge [size: 1x1 color: black style: none] le paramètre (0) évolue suivant un appel à une requête sur une base mysql. J'ai essayé avec la primitive "engage" mais je ne peux plus utiliser "at" et mes images sont inconnues ! idem pour mon port DB ! Merci de me venir en aide Didier | |
Philippe | 3-Jul-2008/15:21:19+2:00 |
Salut, Une petite adaptation de ton code et d'un des miens lui-même adapté d'un de Carl. Le truc est que le timer est géré par un composant invisible (poller). Tu n'as qu'à adapter les cibles avec tes requêtes SQL A noter aussi que tes requêtes ne doivent pas être bloquantes d'om le "attempt", mais améliorable. system/schemes/default/timeout: system/schemes/http/timeout: 5 sev1_img: make image! [150x20 0.0.0.255] sev2_img: make image! [150x20 0.0.0.255] draw sev1_img [ pen coal fill-pen linear 0x0 0 44 89 1 1 silver red coal box 8.0 0x0 149x14 ] draw sev2_img [ pen coal fill-pen linear 0x0 0 44 89 1 1 silver orange coal box 8.0 0x0 149x14 ] poll-time: 00:00:10 ; 10 s BDD: [ ; List of targets [ http://www.google.com/ "Google" ] [ http://www.yahoo.com/ "Yahoo!" ] ] window: [ style text text font [name: "Tahoma" size: 9] ;backcolor white across backeffect [gradient 0x1 black coal] ; c'est poller qui sert de timer pour checker les BDDs poller: txt 0x0 "" rate poll-time feel [ engage: func [f a e] [ if find [time] a [ check-site ] ] ] ] ; inclusion des images ; une p'tite boucle ?? append window compose/deep [ at 20x25 image sev1_img (BDD/1/2) [check-BDD face] [browse face/data] with [ data: (copy BDD/1/1) font/size: 10 font/style: 'bold font/shadow: none font/align: 'center font/valign: 'middle ] at 20x60 image sev2_img (BDD/2/2) [check-BDD face] [browse face/data] with [ data: (copy BDD/2/1) font/size: 10 font/style: 'bold font/shadow: none font/align: 'center font/valign: 'middle ] ] ; inclusion des boutons refresh append window [ across pad 0x30 text "Polling : " white font-size 10 frequency: rotary coal 99x14 data [ "0.1 minute" "0.5 minute" "1 minute" "5 minutes" "15 minutes" "30 minutes" ] effect [ draw [pen coal fill-pen linear 0x0 0 44 89 1 1 silver gray coal silver box 9.0 0x0 99x14 ] ] edge [size: 0x0 color: coal effect: none] font [ name: "Verdana" style: none ; 'bold size: 10 color: 255.255.255 offset: 2x2 space: 0x0 align: 'center valign: 'middle shadow: none ;1x1 colors: [255.255.255 coal] ] [ val: 60 * to-decimal (first parse frequency/data/1 "") poller/rate: to-time val show poller ] return pad 0x10 across ; c'est le bouton refresh qui sert de timer. refresh: btn 70 93.155.216 "Refresh" font-color white [ check-site ] pad 7x0 btn 70 "Quit" 166.0.0 [quit] font-color white ; loggy: txt rejoin [" next test : " test-heure ] return pad 40x20 text "Version : 0.0.0.1" blue ] color-face: func [face color] [ face/effect: reduce ['colorize color] show face ] check-BDD: func [face /local col-face] [ color-face face gray color-face face col-face: either attempt [ read face/data ][green][red] ] check-site: does [ foreach face window/pane [ if face/style = 'image [check-BDD face] ] ] window: center-face layout window window/edge: make face/edge [size: 1x1 color: black style: none] view/new/options center-face window [no-title] check-site do-events ===Philippe | |
Didier | 3-Jul-2008/21:28:58+2:00 |
merci Philippe, | |
Didier | 3-Jul-2008/21:34:03+2:00 |
merci Philippe, juste une chose, dans le prog que je veux faire, je ne souhaite pas changer la couleur des images ( bien que cela m'intéresse )mais je veux change le texte. Dans ton programme il y "google" et "yahoo!", moi je veux afficher un nombre ( qui est un nombre d'incident ) ce nombre est prélevé par une requête SQL. as-tu une idée de la méthode à suivre ? merci encore pour ton aide Didier | |
shadwolf | 4-Jul-2008/9:00:57+2:00 |
Les grand esprit ce rencontrent j'adoooooooooooore !!! Je dis cela car justement j'ai écrit hier matin une petite horloge fort sympatique. que vous trouverez ici: http://shadwolf.free.fr/berlinClock.zip Mais quel est le rapport avec le projet de didier ??? Bien justement l'aspect rafraichiement des images. moi j'ai choisi le mot VID rate le code est comme ca : view/new layout [ ; ; plein de widgets ; encore plus de widgets ; etc... ; rate 1 feel [ ; le 1 ici représente 1 seconde de rafraichissement engage: func [face act evt] [ if act = 'time [ ; on met ici le code a exécuter toute les 1 secondes ] ] ] ] ; fin du layout Voila j'espère que cela vous aidera et aussi que ma petite horloge vous plaira ^^ | |
shadwolf | 4-Jul-2008/9:03:33+2:00 |
rate est liée au layout et donc à la boucle de gestion des évèments VID ce qui est un avantage certain ^^ | |
Bertrand | 4-Jul-2008/10:50:17+2:00 |
Merci pour le tuyau 'rate'. Je cherchais justement un truc dans ce genre pour une animation il y a peu ... et comme je n'ai pas encore vraiment bien assimilé tout ce qui a trait à 'feel', cette solution, que je vais m'empresser d'essayer, tombe bien J'aime beaucoup la "Berlin Clock". Cependant le bouton [QUIT!!] semble ne pas fonctionner. On ne peut sortir qu'au moyen du bouton 'fermer' [X] de la barre de titre. Bert' | |
Bertrand | 4-Jul-2008/11:31:52+2:00 |
Voici, rapidement, le code pour mon animation :REBOL [ Title: "Bouncing ball" Date: 03-jul-2008 Version: 1.0.0 Author: "Bertrand Carette" ] ;;;------------------------------------- ;;; constants, variables and procedures ;;;------------------------------------- bsize: 200x200 ; box size ssize: 30 ; shape size pos: bsize / 2 ; shape position speed: 3x2 ; xy speed dir: 1x1 ; direction bounce: does [ ;; update the position of the shape pos/x: (pos/x + (speed/x * dir/x)) pos/y: (pos/y + (speed/y * dir/y)) ;; test to see if the shape exceeds the boundaries of the screen ;; if it does, reverse its direction if (pos/x > (bsize/x - ssize)) or (pos/x < ssize) [dir/x: - dir/x] if (pos/y > (bsize/y - ssize)) or (pos/y < ssize) [dir/y: - dir/y] ;; move the shape append canvas/effect/draw [fill-pen white circle pos ssize] show canvas ] ;;;---------------------------- ;;; create the GUI ;;;---------------------------- win: layout [ canvas: box bsize gray effect [draw []] rate 100 feel [ ; rate = events per sec. engage: func [face act evt] [ if act = 'time [bounce] ] ] ] ;;;---------------------------- ;;; main loop ;;;---------------------------- view win Pourquoi la 'balle' finit-elle par ralentir ? Est-ce dû à la gestion de l'évènement ou à la gestion de l'affichage ? N.B.: avec ;; initialiser flag à OFF au départ toggle "Start" "Stop" [ flag: not flag while [flag] [wait 0,00001 bounce] ][ flag: not flag ] à la place de rate n feel, on a aussi un ralentissement de l'animation au bout d'un moment ! | |
Bertrand | 4-Jul-2008/12:15:21+2:00 |
Eurêka, j'ai vu ! C'est à cause du append canvas/effect/draw [fill-pen white circle pos ssize]... :( Voilà, je remets les choses en place : (...) bounce: does [ ;; update the position of the shape pos/x: (pos/x + (speed/x * dir/x)) pos/y: (pos/y + (speed/y * dir/y)) ;; test to see if the shape exceeds the boundaries of the screen ;; if it does, reverse its direction if (pos/x > (bsize/x - ssize)) or (pos/x < ssize) [dir/x: - dir/x] if (pos/y > (bsize/y - ssize)) or (pos/y < ssize) [dir/y: - dir/y] ;; move the shape show canvas ] ;;;---------------------------- ;;; create the GUI ;;;---------------------------- win: layout [ canvas: box bsize gray effect [draw [fill-pen white circle pos ssize]] rate 100 feel [; rate = events per sec. engage: func [face act evt] [ if act = 'time [bounce] ] ] ] (...) | |
Bertrand | 4-Jul-2008/12:45:42+2:00 |
Et là : http://processing.org/learning/topics/bounce.html , c'est le même script mais écrit avec Processing ! | |
shadwolf | 4-Jul-2008/18:16:49+2:00 |
oups j'aurai dû l'elever ... le bug que tu constate c'est que le feel de rate confisque (monopolise accapare squate kidnape) tout les events et les trap j'aurai dû a la fin de ce feel réinjecter les event dans la boucle d"évènement principale mais j'ai un peu oublier comment on fait ... | |
shadwolf | 4-Jul-2008/18:17:09+2:00 |
oups j'aurai dû l'elever ... le bug que tu constate c'est que le feel de rate confisque (monopolise accapare squate kidnape) tout les events et les trap j'aurai dû a la fin de ce feel réinjecter les event dans la boucle d"évènement principale mais j'ai un peu oublier comment on fait ... | |
Bertrand | 5-Jul-2008/11:05:05+2:00 |
C'est que je m'étais dit mais je n'étais pas sûr ... car le bouton de fermeture du système [x] n'est pas "squatté" (ce qui n'aurait pas été le cas avec une commande gérée par DO, par exemple)... Comment faut-il faire pour réinjecter les évènements dans la boucle (d'évènements) principale ? | |
Bertrand | 5-Jul-2008/18:20:26+2:00 |
Comment faut-il faire pour réinjecter les évènements dans la boucle (d'évènements) principale ? Je pense avoir trouvé une solution, est-ce la bonne ? REBOL [ Title: "Bouncing ball" Date: 03-jul-2008 Version: 1.0.4 Author: "Bertrand Carette" ] ;;;------------------------------------- ;;; constants, variables and procedures ;;;------------------------------------- bsize: 200x200 ; box size ssize: 30 ; shape size pos: bsize / 2 ; shape position xspeed: 3.20 ; horizontal speed yspeed: 2.10 ; vertical speed dir: 2x2 ; direction ;; move the shape bounce: does [ ;; update the position of the shape pos/x: (pos/x + (xspeed * dir/x)) pos/y: (pos/y + (yspeed * dir/y)) ;; test to see if the shape exceeds the boundaries of the screen ;; if it does, reverse its direction if (pos/x > (bsize/x - ssize)) or (pos/x < ssize) [dir/x: - dir/x] if (pos/y > (bsize/y - ssize)) or (pos/y < ssize) [dir/y: - dir/y] ] ;;;---------------------------- ;;; create the GUI ;;;---------------------------- win: layout [ canvas: box with [ size: bsize color: snow effect: [draw [fill-pen red circle pos ssize]] ] button "Fermer" rate 100 feel [; rate = events per sec. engage: func [face act evt] [ if act = 'time [bounce show canvas] if act = 'down [quit] ] ] ] ;;;---------------------------- ;;; main loop ;;;---------------------------- view win | |
Bertrand | 24-Jul-2008/17:57:37+2:00 |
Finalement j'aime bien aussi cette version REBOL [ Title: "Bouncing ball" Date: 22-jul-2008 Version: 1.0.6 Author: "Bertrand Carette" ] ;;;------------------------------------- ;;; constantes, variables et procédures ;;;------------------------------------- bsize: 210x200 ; taille du canevas ssize: 30 ; taille de la balle pos: bsize / 2 ; position de la balle xspeed: 3.20 ; vitesse en X yspeed: 2.10 ; vitesse en Y dir: 2x2 ; direction flag: off ; interrupteur ;; anime la balle bounce: does [ ;; actualise la position de la balle pos/x: (pos/x + (xspeed * dir/x)) pos/y: (pos/y + (yspeed * dir/y)) ;; si la balle dépasse les limites du canevas ;; on inverse la direction if (pos/x > (bsize/x - ssize)) or (pos/x < ssize) [dir/x: - dir/x] if (pos/y > (bsize/y - ssize)) or (pos/y < ssize) [dir/y: - dir/y] ] ;;;----------------------------------- ;;; creation de l'interface graphique ;;;----------------------------------- win: layout [ canvas: box with [ size: bsize color: snow effect: [draw [fill-pen red circle pos ssize]] ] across toggle "Démarrer" "Arrêter" [ flag: not flag while [flag] [wait 0,03 bounce show canvas] ][ flag: not flag ] button "Fermer" [quit] ] ;;;---------------------------- ;;; BOUCLE PRINCIPALE ;;;---------------------------- view win | |
Login required to Post. |