petit bug génant - flick et clignotement
- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07
petit bug génant - flick et clignotement
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
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
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
.....
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

J'espere que ta boucle WindowEvent() ressemble a ca:
C'est tres important de ne faire le Delay() que si aucun evement ne reste dans la file d'attente.
Code : Tout sélectionner
Event = WindowEvent()
If Event
; Process the events
Else
Delay(10)
EndIf
- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07
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.
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.
- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07
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
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.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
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

Dernière modification par Dr. Dri le ven. 06/janv./2006 15:18, modifié 1 fois.
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
Voila un exemple, comme ca il aura les deux méthodes ^^
Dri 
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

Lance ton code, et bouge la fenêtre pendant quelques secondes!Dr. Dri a écrit :Voila un exemple, comme ca il aura les deux méthodes ^^DriCode : 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
- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07
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]
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
- Crystal Noir
- Messages : 892
- Inscription : mar. 27/janv./2004 10:07
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.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 ^^
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.