Page 1 sur 3
petit bug génant - flick et clignotement
Publié : ven. 06/janv./2006 11:35
par Crystal Noir
bon j'ai cherché un peu sur ce forum mais j'ai pas trouvé bonheur, pourtant la question a déjà été abordée :
Sous une appli fait avec pure et surtout la mienne, les gadgets flick un peu (clignote quoi).
C'est un programme qui parfois doit récupérer des informations en temps reel comme par ex la position x et y de la souris ou l'heure système avec les secondes.
alors si je fais un WaitWindowsEvent() ca rafraichit pas sauf si un évènement survient (bouger la souris, cliquer etc...) et la pas trop de clignotement.
si je fais un WindowEvent() avec un delay(10)
Et bien la le soft rafraichit bien mais j'ai de gros clignotement à chaque refresh des infos....
Bref j'aimerais bien améliorer ca....
Merci pour vos infos
Publié : ven. 06/janv./2006 12:06
par Chris
1/ Tu as essayé avec un timer, ou par la callback ?
2/ Tu n'est peut-être pas obligé de rafraichir toute la fenêtre.
Publié : ven. 06/janv./2006 12:11
par Backup
le clignotement est due a la VBL (Vertical Blank Landing)
le rafraichissement vertical , le temps que met le "pinceau" de l'ecran
pour arriver jusqu'en bas avant de remonter pour rafraichier toute l'image
vu qu'avec les gadgets (les appli fenetré) nous n'avont pas le control du VBL
(contrairement au apli ecran-graphique)
le seul moyen serai d'augmenter le rafraichissement de ton ecran
(qui doit etre a 50 Hz ou 60 hz) d'apres tes dires...
ce reglage se fait a partir des reglages de ta resolution et de ta carte graphique ... (screen refresh Rate avec Nvidia) perso je suis en 85 hz
et ça va pas trop mal

.....
Publié : ven. 06/janv./2006 12:49
par Fred
J'espere que ta boucle WindowEvent() ressemble a ca:
Code : Tout sélectionner
Event = WindowEvent()
If Event
; Process the events
Else
Delay(10)
EndIf
C'est tres important de ne faire le Delay() que si aucun evement ne reste dans la file d'attente.
Publié : ven. 06/janv./2006 13:15
par Crystal Noir
oui ma boucle ressemble à ca
pour le callback j'ai jamais compris comment ca marchait et quoi ca peut m'être utile sur ce problème, si vous pouviez m'expliquer ?
pour le rafraichissement de l'écran, je me vois mal distribuer une aplli windows en disant qu'il faut changer le rafraichissement, moi perso je tourne en 75 hz.
Publié : ven. 06/janv./2006 15:01
par Crystal Noir
je corrige : ma boucle ressemble à ça mais à une chose près :
j'utilise un panel gadget. de ce fait je fais pas un event mais un getgadgetstate pour savoir quel onglet est actif. Si c tel onglet alors je rafraichis. le problème c que pour certains onglets j'ai besoin d'un rafraichissement permanent si on prend par ex les secondes d'une horloge....
si je le met entre un If Event endif le rafraichissement se fera uniquement si il se passe quelque chose....
j'sais pas trop comment faire en fait mdr
Publié : ven. 06/janv./2006 15:08
par Dr. Dri
Crystal Noir a écrit :je corrige : ma boucle ressemble à ça mais à une chose près :
j'utilise un panel gadget. de ce fait je fais pas un event mais un getgadgetstate pour savoir quel onglet est actif. Si c tel onglet alors je rafraichis. le problème c que pour certains onglets j'ai besoin d'un rafraichissement permanent si on prend par ex les secondes d'une horloge....
si je le met entre un If Event endif le rafraichissement se fera uniquement si il se passe quelque chose....
j'sais pas trop comment faire en fait mdr
Avec un timer (SetTimer_ et KillTimer_) c'est amplement suffisant... Pour une horloge qui affiche les secondes tu n'as besoin de rafraichir... que toutes les secondes.
Je suis sur une appli qui gère deux timers (pour le moment) un qui s'exécute toutes les secondes et un autre toutes les 50 millisecondes et pourtant j'ai pas de probleme d'affichage...
Dri

Publié : ven. 06/janv./2006 15:14
par Chris
Ca suffit pas, ça?
Code : Tout sélectionner
Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Select uMsg
Case #WM_TIMER
Select idEvent
Case 1
SetGadgetText(10, FormatDate("%hh : %ii : %ss", Date()))
EndSelect
EndSelect
EndProcedure
If OpenWindow(0,0,0,322,220,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"PanelGadget") And CreateGadgetList(WindowID(0))
PanelGadget (0,8,8,306,203)
AddGadgetItem (0,-1,"Panel 1")
PanelGadget (1,5,5,290,166)
AddGadgetItem(1,-1,"Sub-Panel 1")
TextGadget(10, 20, 10, 270, 20, "Il est ")
AddGadgetItem(1,-1,"Sub-Panel 2")
AddGadgetItem(1,-1,"Sub-Panel 3")
CloseGadgetList()
AddGadgetItem (0,-1,"Panel 2")
ButtonGadget(2, 10, 15, 80, 24,"Button 1")
ButtonGadget(3, 95, 15, 80, 24,"Button 2")
CloseGadgetList()
SetTimer_(WindowID(), 1, 100, @TimerProc())
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
End
Publié : ven. 06/janv./2006 15:18
par Dr. Dri
Chris a écrit :Ca suffit pas, ça?
Encore plus simple ^^
Sans la callback du timer il peut récupérer l'Event WM_TIMER
Dri

Publié : ven. 06/janv./2006 15:21
par Chris
Dr. Dri a écrit :Chris a écrit :Ca suffit pas, ça?
Encore plus simple ^^
Sans la callback du timer il peut récupérer l'Event WM_TIMER
Dri

Je sais, mais moi, je fais toujours comme ça.
Publié : ven. 06/janv./2006 15:22
par Dr. Dri
Voila un exemple, comme ca il aura les deux méthodes ^^
Code : Tout sélectionner
If OpenWindow(0,0,0,322,220,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"PanelGadget") And CreateGadgetList(WindowID(0))
PanelGadget (0,8,8,306,203)
AddGadgetItem (0,-1,"Panel 1")
PanelGadget (1,5,5,290,166)
AddGadgetItem(1,-1,"Sub-Panel 1")
TextGadget(10, 20, 10, 270, 20, "Il est ")
AddGadgetItem(1,-1,"Sub-Panel 2")
AddGadgetItem(1,-1,"Sub-Panel 3")
CloseGadgetList()
AddGadgetItem (0,-1,"Panel 2")
ButtonGadget(2, 10, 15, 80, 24,"Button 1")
ButtonGadget(3, 95, 15, 80, 24,"Button 2")
CloseGadgetList()
SetTimer_(WindowID(), 1, 1000, #Null)
Repeat
Event = WaitWindowEvent()
If Event = #WM_TIMER
If EventwParam() = 1
SetGadgetText(10, FormatDate("%hh : %ii : %ss", Date()))
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Dri

Publié : ven. 06/janv./2006 15:25
par Chris
Dr. Dri a écrit :Voila un exemple, comme ca il aura les deux méthodes ^^
Code : Tout sélectionner
If OpenWindow(0,0,0,322,220,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"PanelGadget") And CreateGadgetList(WindowID(0))
PanelGadget (0,8,8,306,203)
AddGadgetItem (0,-1,"Panel 1")
PanelGadget (1,5,5,290,166)
AddGadgetItem(1,-1,"Sub-Panel 1")
TextGadget(10, 20, 10, 270, 20, "Il est ")
AddGadgetItem(1,-1,"Sub-Panel 2")
AddGadgetItem(1,-1,"Sub-Panel 3")
CloseGadgetList()
AddGadgetItem (0,-1,"Panel 2")
ButtonGadget(2, 10, 15, 80, 24,"Button 1")
ButtonGadget(3, 95, 15, 80, 24,"Button 2")
CloseGadgetList()
SetTimer_(WindowID(), 1, 1000, #Null)
Repeat
Event = WaitWindowEvent()
If Event = #WM_TIMER
If EventwParam() = 1
SetGadgetText(10, FormatDate("%hh : %ii : %ss", Date()))
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Dri

Lance ton code, et bouge la fenêtre pendant quelques secondes!
Publié : ven. 06/janv./2006 18:30
par Crystal Noir
va falloir que j'étudie tout ca, en fait j'sais pas trop ce que je dois prendre dans tout ca, d'après ce que j'ai compris faut faire un timer, cela dit je pige pas trop cette procédure dans votre code ?
Code : Tout sélectionner
Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Select uMsg
Case #WM_TIMER
Select idEvent
Case 1
SetGadgetText(10, FormatDate("%hh : %ii : %ss", Date()))
EndSelect
EndSelect
EndProcedure
[/code]
Publié : ven. 06/janv./2006 18:40
par Crystal Noir
disons que j'arrive plus ou moins à piger mais je trouve nulle part le #VM_Timer dans la doc.
ensuite la procédure veut avoir des paramètres mais apparement on en met aucun lors de l'appel du timer ? enfin bref, j'ai besoin de lumière, merci ^^
Publié : ven. 06/janv./2006 18:48
par Chris
Crystal Noir a écrit :disons que j'arrive plus ou moins à piger mais je trouve nulle part le #VM_Timer dans la doc.
ensuite la procédure veut avoir des paramètres mais apparement on en met aucun lors de l'appel du timer ? enfin bref, j'ai besoin de lumière, merci ^^
Tu n'as pas de paramètres à passer. Ca fonctionne comme une callback, mais ç'est indépendant des autre évènements de la fenêtre.
Les paramètres tu les récupères. Tu ne les passe pas.
hwnd, c'est le handle de la fenêtre à laquelle est affectée le timer
uMsg, c'est le message #WM_TIMER
IdEvent, c'est le n° du timer. 1, 2, 3,..., etc.
dwTime, renvoie le nombre de millisecondes depuis que le systeme a été lancé.
Voilà la definition de Microsoft
TimerProc Function
--------------------------------------------------------------------------------
The TimerProc function is an application-defined callback function that processes WM_TIMER messages. The TIMERPROC type defines a pointer to this callback function. TimerProc is a placeholder for the application-defined function name.
Syntax
VOID CALLBACK TimerProc( HWND hwnd,
UINT uMsg,
UINT_PTR idEvent,
DWORD dwTime
);
Parameters
hwnd
[in] Handle to the window associated with the timer.
uMsg
[in] Specifies the WM_TIMER message.
idEvent
[in] Specifies the timer's identifier.
dwTime
[in] Specifies the number of milliseconds that have elapsed since the system was started. This is the value returned by the GetTickCount function.
Return Value
This function does not return a value.