Utilisation d'un timer dans un layout
Didier1-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
Philippe3-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
Didier3-Jul-2008/21:28:58+2:00
merci Philippe,
Didier3-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
shadwolf4-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 ^^
shadwolf4-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 ^^
Bertrand4-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'
Bertrand4-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 !
Bertrand4-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]
        ]
    ]
]
(...)

Bertrand4-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 !
shadwolf4-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 ...
shadwolf4-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 ...
Bertrand5-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 ?
Bertrand5-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
Bertrand24-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.


Powered by RebelBB and REBOL 2.7.8.4.2