petit bug génant - flick et clignotement

Programmation d'applications complexes
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

petit bug génant - flick et clignotement

Message 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
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 :D .....
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message 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.
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message 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.
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 ;)
Dernière modification par Dr. Dri le ven. 06/janv./2006 15:18, modifié 1 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 :)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 ;)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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!
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message 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]
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message 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 ^^
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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.
Répondre