![]() |
| 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. | |