Trop de gadgets ?

Programmation d'applications complexes
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Trop de gadgets ?

Message par Oliv »

Bonjour,
J'ai fait cette interface, seulement je trouve que le chargement des gadgets est long : On voit les gadgets se dessiner un à un quand on change d'onglet ou quand ouvre la fenêtre. Est-ce moi qui ai loupé quelquechose ? ça m'étonne que mon PC soit dépassé ou que j'ai mis trop de gadgets....
Vous auriez une idée ? Désactiver les gagdets non affichés ?

Merci

Code : Tout sélectionner

; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Principale
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #Quitter
  #Aide
  #A_Propos
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Panel
  #Liste_Musique
  #Ajouter
  #Retirer
  #Lire
  #Suivant
  #Frame_Opt_Gales
  #Text_Opt_Gales
  #Text_3
  #Text_4
  #S_Serie
  #S_Token
  #Frame_Opt_Musique
  #Text_Opt_Musique
  #Text_Port
  #S_Port
  #Frame3D_3
  #Text_8
  #Editor_0
  #Envoyer_Message
  #Frame_Oreilles
  #Text_9
  #Text_10
  #S_Pos_GActuelle
  #S_Pos_DActuelle
  #Text_18
  #S_Pos_GSouhait
  #S_Pos_DSouhait
  #Envoyer_Oreilles
  #Text_Voix
  #Frame3D_5
  #Text_Radio
  #Text_Vitesse
  #Text_Frequence
  #Combo_Voix
  #Spin_Vitesse
  #Spin_Frequence
  #Button_Enregistrer
  #Defaut
  #Combo_Radio
  #Ecouter
  #Text_23
  #Text_24
  #Frame3D_6
  #Text_25
  #Status
EndEnumeration


Procedure Open_Principale()
  If OpenWindow(#Principale, 268, 225, 650, 400, "Nom Fenetre",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar )
    If CreateMenu(#MenuBar_0, WindowID(#Principale))
      MenuTitle("Fichier")
      MenuItem(#Quitter, "Quitter")
      MenuTitle("Aide")
      MenuItem(#Aide, "Aide...")
      MenuItem(#A_Propos, "A Propos...")
      EndIf

      If CreateGadgetList(WindowID(#Principale))
        
        ;- Panel
        PanelGadget(#Panel, 1, 0, 649, 380)
        AddGadgetItem(#Panel, -1, "Commandes")
        Frame3DGadget(#Frame3D_3, 7, 8, 480, 170, "")
        TextGadget(#Text_8, 17, 18, 100, 20, "Envoyer un message")
        EditorGadget(#Editor_0, 17, 48, 310, 90)
        ButtonGadget(#Envoyer_Message, 307, 148, 130, 20, "Envoyer")
        Frame3DGadget(#Frame_Oreilles, 7, 188, 210, 160, "")
        TextGadget(#Text_9, 17, 198, 100, 20, "Oreilles")
        TextGadget(#Text_10, 37, 218, 150, 20, "Position actuelle", #PB_Text_Center)
        StringGadget(#S_Pos_GActuelle, 57, 238, 50, 20, "", #PB_String_ReadOnly)
        StringGadget(#S_Pos_DActuelle, 117, 238, 50, 20, "", #PB_String_ReadOnly)
        TextGadget(#Text_18, 37, 268, 160, 20, "Position souhaitée", #PB_Text_Center)
        StringGadget(#S_Pos_GSouhait, 57, 288, 50, 20, "")
        StringGadget(#S_Pos_DSouhait, 117, 288, 50, 20, "")
        ButtonGadget(#Envoyer_Oreilles, 67, 318, 100, 20, "Envoyer")
        TextGadget(#Text_Voix, 337, 48, 55, 20, "Voix", #PB_Text_Center)
        Frame3DGadget(#Frame3D_5, 236, 188, 250, 160, "")
        TextGadget(#Text_Radio, 246, 198, 80, 20, "Radio")
        TextGadget(#Text_Vitesse, 337, 78, 55, 20, "Vitesse", #PB_Text_Center)
        TextGadget(#Text_Frequence, 337, 108, 55, 20, "Fréquence", #PB_Text_Center)
        ComboBoxGadget(#Combo_Voix, 407, 48, 70, 20)
        SpinGadget(#Spin_Vitesse, 407, 78, 70, 20, 0, 10)
        SpinGadget(#Spin_Frequence, 407, 108, 70, 20, 0, 10)
        ComboBoxGadget(#Combo_Radio, 257, 278, 220, 20)
        ButtonGadget(#Ecouter, 346, 308, 130, 20, "Ecouter")
        TextGadget(#Text_23, 256, 228, 220, 20, "Sélectionnez une radio ou entrez une adresse")
        TextGadget(#Text_24, 256, 238, 220, 20, "sous la forme Adresse:Port")
        Frame3DGadget(#Frame3D_6, 497, 188, 140, 160, "")
        TextGadget(#Text_25, 507, 198, 70, 20, "Sommeil")
        ButtonGadget(#Status, 527, 268, 90, 30, "Endormir")
        AddGadgetItem(#Panel, -1, "Musique")
        
        ;-
        ListIconGadget(#Liste_Musique, 7, 8, 630, 310, "Fichier", 100, #PB_ListIcon_CheckBoxes | #PB_ListIcon_MultiSelect | #PB_ListIcon_GridLines | #PB_ListIcon_HeaderDragDrop)
        ButtonGadget(#Ajouter, 84, 328, 100, 20, "Ajouter")
        ButtonGadget(#Retirer, 194, 328, 100, 20, "Retirer")
        ButtonGadget(#Lire, 414, 328, 150, 20, "Lire")
        ButtonGadget(#Suivant, 304, 328, 100, 20, "Suivant")
        AddGadgetItem(#Panel, -1, "Options")
        Frame3DGadget(#Frame_Opt_Gales, 7, 8, 480, 150, "")
        TextGadget(#Text_Opt_Gales, 17, 18, 110, 20, "Options générales")
        TextGadget(#Text_3, 196, 38, 100, 20, "Numéro de série :")
        TextGadget(#Text_4, 196, 78, 100, 20, "Numéro de token :")
        StringGadget(#S_Serie, 306, 38, 150, 20, "")
        StringGadget(#S_Token, 306, 78, 150, 20, "", #PB_String_Numeric)
        Frame3DGadget(#Frame_Opt_Musique, 7, 168, 190, 180, "")
        TextGadget(#Text_Opt_Musique, 17, 178, 100, 20, "Options musique")
        TextGadget(#Text_Port, 57, 218, 40, 20, "Port :")
        StringGadget(#S_Port, 107, 218, 80, 20, "", #PB_String_Numeric)
        ButtonGadget(#Button_Enregistrer, 277, 128, 90, 20, "Enregistrer")
        ButtonGadget(#Defaut, 377, 128, 100, 20, "Valeurs par defaut")
        CloseGadgetList()
        
      EndIf
    EndIf
EndProcedure

Open_Principale()


Repeat
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      Sortie = 1
    Case #PB_Event_Menu
      Select EventMenu()
        Case #Quitter
          Sortie = 1
      EndSelect
  EndSelect
  Delay(10)
Until Sortie = 1

End
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

ça me fait ça aussi lorsqu'il y a beaucoup de gadget... Bon c'est pas vraiment génant ça se voit mais ça ne dure que 2 ou 3 sec max.
Mais c'est vrai que ce n'est pas tres jolies....
j'ai aussi testé avec l'option SmartWindowRefresh(#Fenetre, Etat) mais ça ne change rien
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Commente le Delay(10)
D'ailleurs pourquoi l'avoir mis ?

Autre chose, lorsque tu dois afficher plusieurs centaines de gadgets et afin de ne pas voir le dessin en cours de la fenêtre, il est possible de la rendre invisible durant sa création et de ne l'afficher qu'après.
Ton code ainsi modifié donne ça :

Code : Tout sélectionner

;- Window Constants
;
Enumeration
  #Principale
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #Quitter
  #Aide
  #A_Propos
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Panel
  #Liste_Musique
  #Ajouter
  #Retirer
  #Lire
  #Suivant
  #Frame_Opt_Gales
  #Text_Opt_Gales
  #Text_3
  #Text_4
  #S_Serie
  #S_Token
  #Frame_Opt_Musique
  #Text_Opt_Musique
  #Text_Port
  #S_Port
  #Frame3D_3
  #Text_8
  #Editor_0
  #Envoyer_Message
  #Frame_Oreilles
  #Text_9
  #Text_10
  #S_Pos_GActuelle
  #S_Pos_DActuelle
  #Text_18
  #S_Pos_GSouhait
  #S_Pos_DSouhait
  #Envoyer_Oreilles
  #Text_Voix
  #Frame3D_5
  #Text_Radio
  #Text_Vitesse
  #Text_Frequence
  #Combo_Voix
  #Spin_Vitesse
  #Spin_Frequence
  #Button_Enregistrer
  #Defaut
  #Combo_Radio
  #Ecouter
  #Text_23
  #Text_24
  #Frame3D_6
  #Text_25
  #Status
EndEnumeration


Procedure Open_Principale()
  If OpenWindow(#Principale, 268, 225, 650, 400, "Nom Fenetre",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar |#PB_Window_Invisible )
    If CreateMenu(#MenuBar_0, WindowID(#Principale))
      MenuTitle("Fichier")
      MenuItem(#Quitter, "Quitter")
      MenuTitle("Aide")
      MenuItem(#Aide, "Aide...")
      MenuItem(#A_Propos, "A Propos...")
      EndIf

      If CreateGadgetList(WindowID(#Principale))
       
        ;- Panel
        PanelGadget(#Panel, 1, 0, 649, 380)
        AddGadgetItem(#Panel, -1, "Commandes")
        Frame3DGadget(#Frame3D_3, 7, 8, 480, 170, "")
        TextGadget(#Text_8, 17, 18, 100, 20, "Envoyer un message")
        EditorGadget(#Editor_0, 17, 48, 310, 90)
        ButtonGadget(#Envoyer_Message, 307, 148, 130, 20, "Envoyer")
        Frame3DGadget(#Frame_Oreilles, 7, 188, 210, 160, "")
        TextGadget(#Text_9, 17, 198, 100, 20, "Oreilles")
        TextGadget(#Text_10, 37, 218, 150, 20, "Position actuelle", #PB_Text_Center)
        StringGadget(#S_Pos_GActuelle, 57, 238, 50, 20, "", #PB_String_ReadOnly)
        StringGadget(#S_Pos_DActuelle, 117, 238, 50, 20, "", #PB_String_ReadOnly)
        TextGadget(#Text_18, 37, 268, 160, 20, "Position souhaitée", #PB_Text_Center)
        StringGadget(#S_Pos_GSouhait, 57, 288, 50, 20, "")
        StringGadget(#S_Pos_DSouhait, 117, 288, 50, 20, "")
        ButtonGadget(#Envoyer_Oreilles, 67, 318, 100, 20, "Envoyer")
        TextGadget(#Text_Voix, 337, 48, 55, 20, "Voix", #PB_Text_Center)
        Frame3DGadget(#Frame3D_5, 236, 188, 250, 160, "")
        TextGadget(#Text_Radio, 246, 198, 80, 20, "Radio")
        TextGadget(#Text_Vitesse, 337, 78, 55, 20, "Vitesse", #PB_Text_Center)
        TextGadget(#Text_Frequence, 337, 108, 55, 20, "Fréquence", #PB_Text_Center)
        ComboBoxGadget(#Combo_Voix, 407, 48, 70, 20)
        SpinGadget(#Spin_Vitesse, 407, 78, 70, 20, 0, 10)
        SpinGadget(#Spin_Frequence, 407, 108, 70, 20, 0, 10)
        ComboBoxGadget(#Combo_Radio, 257, 278, 220, 20)
        ButtonGadget(#Ecouter, 346, 308, 130, 20, "Ecouter")
        TextGadget(#Text_23, 256, 228, 220, 20, "Sélectionnez une radio ou entrez une adresse")
        TextGadget(#Text_24, 256, 238, 220, 20, "sous la forme Adresse:Port")
        Frame3DGadget(#Frame3D_6, 497, 188, 140, 160, "")
        TextGadget(#Text_25, 507, 198, 70, 20, "Sommeil")
        ButtonGadget(#Status, 527, 268, 90, 30, "Endormir")
        AddGadgetItem(#Panel, -1, "Musique")
       
        ;-
        ListIconGadget(#Liste_Musique, 7, 8, 630, 310, "Fichier", 100, #PB_ListIcon_CheckBoxes | #PB_ListIcon_MultiSelect | #PB_ListIcon_GridLines | #PB_ListIcon_HeaderDragDrop)
        ButtonGadget(#Ajouter, 84, 328, 100, 20, "Ajouter")
        ButtonGadget(#Retirer, 194, 328, 100, 20, "Retirer")
        ButtonGadget(#Lire, 414, 328, 150, 20, "Lire")
        ButtonGadget(#Suivant, 304, 328, 100, 20, "Suivant")
        AddGadgetItem(#Panel, -1, "Options")
        Frame3DGadget(#Frame_Opt_Gales, 7, 8, 480, 150, "")
        TextGadget(#Text_Opt_Gales, 17, 18, 110, 20, "Options générales")
        TextGadget(#Text_3, 196, 38, 100, 20, "Numéro de série :")
        TextGadget(#Text_4, 196, 78, 100, 20, "Numéro de token :")
        StringGadget(#S_Serie, 306, 38, 150, 20, "")
        StringGadget(#S_Token, 306, 78, 150, 20, "", #PB_String_Numeric)
        Frame3DGadget(#Frame_Opt_Musique, 7, 168, 190, 180, "")
        TextGadget(#Text_Opt_Musique, 17, 178, 100, 20, "Options musique")
        TextGadget(#Text_Port, 57, 218, 40, 20, "Port :")
        StringGadget(#S_Port, 107, 218, 80, 20, "", #PB_String_Numeric)
        ButtonGadget(#Button_Enregistrer, 277, 128, 90, 20, "Enregistrer")
        ButtonGadget(#Defaut, 377, 128, 100, 20, "Valeurs par defaut")
        CloseGadgetList()
       
      EndIf
    EndIf
EndProcedure

Open_Principale()
HideWindow(#Principale, 0)

Repeat
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      Sortie = 1
    Case #PB_Event_Menu
      Select EventMenu()
        Case #Quitter
          Sortie = 1
      EndSelect
  EndSelect
 ; Delay(10)
Until Sortie = 1

End
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Jacobus a écrit :Commente le Delay(10)
D'ailleurs pourquoi l'avoir mis ?
ça marche ... j'aurais jamais penser a ça lollllllllllll :lol:
j'étais persuadé que le rafraichissement des fenetre était gerer en parallèle part windows et pas directement part le programme ...
comme quoi ...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

tu peux mettre un delay(), faut juste vérifier qu'il n'y a pas d'évènements à traiter , et les gadgets sont affichés correctement.

Code : Tout sélectionner

Select WindowEvent()
    Case 0
      Delay(10)
Jacobus a écrit :Commente le Delay(10)
D'ailleurs pourquoi l'avoir mis ?
Pour ne pas bouffer 100% de CPU ?
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Il suffit de remplacer WindowEvent() par WaitWindowEvent() et le programme de prendra pas 100% du CPU et le Delay(10) deviendra totalement inutile.

A+
Guimauve
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Guimauve a écrit :Il suffit de remplacer WindowEvent() par WaitWindowEvent() et le programme de prendra pas 100% du CPU et le Delay(10) deviendra totalement inutile.

A+
Guimauve
Je préfère ça aussi
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

forum application

Message par beauregard »

Jacobus a écrit :
Guimauve a écrit :Il suffit de remplacer WindowEvent() par WaitWindowEvent() et le programme de prendra pas 100% du CPU et le Delay(10) deviendra totalement inutile.
Cela s'applique uniquement pour les applications, et non pas pour les jeux, ai-je bien compris ?
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Merci :)

Comme le dis Comtois, le Delay() est pour libérer les ressources. Je ne peux pas utiliser WaitWindowEvent() car le programme doit pouvoir fonctionner aussi pour le réseau, donc si il est désactivé.
En tout cas merci Comtois, ta solution est la meilleure :D . Par contre j'aimerai comprendre : pourquoi le rafraichissement de la fenêtre dépend du temps d'éxécution de la boucle ? Quelqu'un sait comment c'est géré ?

Beauregard : Oui, en fait WaitWindowEvent() bloque la fenêtre jusqu'a ce qu'un évènement intervienne dessus.

Edit : Il y a maintenant un paramètre qui permet de tout combiner : WaitWindowEvent(10) :P
Dernière modification par Oliv le mar. 18/déc./2007 22:23, modifié 1 fois.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Oliv a écrit : Quelqu'un sait comment c'est géré ?
ché pas, l'ignare que je suis testerai en rajoutant un flip, hum, ou en excutant une partie de ton code 1 fois sur 2...
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

Oliv a écrit :Je ne peux pas utiliser WaitWindowEvent() car le programme doit pouvoir fonctionner aussi pour le réseau, donc si il est désactivé.
Tu peux mettre à la place un WaitWindowEvent(10) :wink:
Ainsi ta boucle sera passée en revue toutes les 10ms même si aucun évènement n'intervient et la aussi ton appli ne prendra pas tout le temps process.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

RV a écrit :
Oliv a écrit :Je ne peux pas utiliser WaitWindowEvent() car le programme doit pouvoir fonctionner aussi pour le réseau, donc si il est désactivé.
Tu peux mettre à la place un WaitWindowEvent(10) :wink:
Ainsi ta boucle sera passée en revue toutes les 10ms même si aucun évènement n'intervient et la aussi ton appli ne prendra pas tout le temps process.
Oui c'est ce que j'ai vu. C'était pas là quand j'ai commencé et ça a jamais été dans l'historique des changement ça, du coup hop, à la trappe :lol: :lol:
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Il est toujours possible d'utiliser #PB_Window_Invisible à la création de la fenêtre puis de la montrer avec HideWindow() lorque tous les gadgets ont été créés.
Ou s'amuser avec le message WM_SETREDRAW ...
Répondre