IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Chargement trop long


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut Chargement trop long
    Bonjour a tous,
    je ne sais pas si le problème vient du .net ou plutôt de sql serveur mais je me tente a poser la question ici :

    j'ai une liste de code postaux que je load au load de la form , pour les afficher dans une liste déroulante...
    hors il y en a 20000 et cela me fige mon écran durant environ 3 secondes , il y aurait il une solution viable a ce problème ??

    cdt,

    le_chom

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 310
    Par défaut
    Euh 20000....Je pense que c'est tout à fait normal que ton écran se fige. Je suppose que tu as placé le chargement de la liste déroulante dans un While ? Je ne pense pas que cela vienne de la requête à la base mais bien du chargement de la liste et à mon avis tu ne pourras rien y faire. Juste pour savoir, tu déclenches quand le remplissage de ta liste ?

  3. #3
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    en fait je charge d'abord ma collection ( effectivement sur un while )
    puis je définis la datasource de ma combobox

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    la latence de 3s peut être due à toute une série de problèmes...

    - le lien de mauvaise qualité entre ton appli et le serveur SQL si machines différentes.
    - la requête SQL pas forcément heureuse
    - le type de SGBD et la façon dont la table est créée

    du coté de dotnet :
    - en winforms... a tu suspendu l'affichage/figé l'affichage de ta liste pendant que tu nourri le contenu.
    - tu as fait le chargement complet dans le formLoad donc tu bloque ton thread principal qui attend la fin de la requête SQL puis qui ajoute les données dans ta liste...

    Il faudrait revoir un peu le principe de fonctionnement, et gérer une requête SQL Asynchrone (cela peut se faire par une tâche dans la pool de threads... il vaut mieux éviter d'utiliser un vrai thread)
    en fait ton évènement load lance la chargement dans une tâche de pool, et continue de définir les éléments de tracés.
    Cette tâche va donc faire la requête SQL et attendre le résultat, quand elle va avoir le résultat, elle va transmettre ce résultat dans une tâche (un délégué pourquoi pas) synchronisée sur le thread UI, et s'arrêter.
    Le thread UI lorsqu'il va voir qu'il a une tâche à effectuer et que le reste de ses messages est traité, va exécuter cette tâche dans laquelle tu fait
    1. un SuspendLayout sur la liste à mettre à jour
    2. changer le datasource
    3. un ResumeLayout

    L'intérêt de cette méthode aux abord un peu compliqué fait que même si tu ne réduit pas forcément les temps (bien que je suis convaincu que le SuspendLayout à lui seul va la réduire énormément) l'UI ne sera plus bloqué pendant ce traitement, et donnera donc une impression de réponse à l'utilisateur.

    Je suppose cela dit que tu est bien en winforms car ton problème ne relève pas de VB.NET mais bien de Windows Forms ou autre...

  5. #5
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    avant de m'engouffrer dans la seconde solution
    ou puis je trouver la propriété SuspendLayout ??? je ne la vois pas sur ma form ni mes combobox :-/

  6. #6
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Sur ton formulaire principal... Tu tapes:


  7. #7
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    Essayé mais ça n'a rien changé, je vais tenter via un thread

    merci

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonsoir,
    Citation Envoyé par cinemania Voir le message
    du coté de dotnet :
    - en winforms... a tu suspendu l'affichage/figé l'affichage de ta liste pendant que tu nourri le contenu.
    je pense que cinemania parle de ça :
    http://msdn.microsoft.com/fr-fr/libr...8VS.90%29.aspx

  9. #9
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Inexpliquablement, le Framework 3.5 a apporté une nette amélioration de performance dans un cas similaire (DataGridView au lieu de Listview).

    A vérifier

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Inexpliquablement, le Framework 3.5 a apporté une nette amélioration de performance dans un cas similaire (DataGridView au lieu de Listview).

    A vérifier
    Bonjour,
    En effet, à condition de passer la propriété VirtualMode du DGV à true.
    Puis gérer derrière.
    Sinon, le chargement n'est guère plus rapide que dans un ComboBox, me semble t'il?

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    le problème de poster dans le forum de VB.NET plutot que dans le forum de la techno qu'il a employé, c'est qu'on avance un peu dans le brouillard...

  12. #12
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    Citation Envoyé par cinemania Voir le message
    le problème de poster dans le forum de VB.NET plutot que dans le forum de la techno qu'il a employé, c'est qu'on avance un peu dans le brouillard...
    Solution toujours en cours de recherche, j'ai posté en vb.net car je travaille effectivement en vb.net

    la solution proposé par chrismonoye n'a rien changé non plus

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Private Sub LoadCP()
            ComboBoxIdCP.BeginUpdate()
            Dim CPVILLEListe As New CPVILLECollection()
            CPVILLEListe = CPVILLEListe.Load()
            Dim cpvilleNull As New CPVILLE()
            ComboBoxIdCP.DataSource = CPVILLEListe
            ComboBoxIdCP.ValueMember = "CP"
            ComboBoxIdCP.DisplayMember = "CP"
            ComboBoxIdCP.EndUpdate()
        End Sub
    ainsi que la méthode Load() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    private List<CPVILLE> DataLoad()
            {
                try
                {
                    DbConnection cnx = Connexion.GetInstance().GetConnexion();
                    DbCommand cmd = cnx.CreateCommand();
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.CommandText = "sp_CP_SelectAll";
     
                    DbDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        CPVILLE cpVilleTemp = new CPVILLE();
                        if(reader["CP"].ToString() != "")
                        {
                            cpVilleTemp.CP = reader["CP"].ToString();
                            if (reader["Ville"].ToString() != "")
                            {
                                cpVilleTemp.Ville = reader["Ville"].ToString();
                            }
     
                        }
                        if (cpVilleTemp.CP != "" && cpVilleTemp.Ville != "")
                        {
                            this.Add(
                                cpVilleTemp
                            );
                        }
                    }
     
                    Connexion.GetInstance().CloseConnexion();
     
                    return this;
                }
                catch (Exception)
                {
                    Connexion.GetInstance().CloseConnexion();
                    return null;
                }
            }

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    ta posté sur vb.net parce que tu développe en vb.net...
    ca répond pas du tout au fait que ta pas posté là où il aurait fallut...

    ton problème ne concerne pas VB.NET mais plutot la technologie que tu veux manipuler... VB.NET dans ce cas n'est pas une technologie...

    là en l'occurrence, je faisait référence à WinForms, ASP.NET ou WPF...

    comme je t'ai dit fait la récupération de ta datasource dans une tâche dans la pool de thread ou dans un Backgrounder.
    car déjà d'office là tu bloque le thread ui pendant le chargement de la requête...

    voici un peu de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     Private Sub onLoad(sender as Object, e as System.EventArgs) Handles Me.Load
            System.Threading.ThreadPool.QueueUserWorkItem(AddressOf reqSQL)
     End Sub
     
     Private Sub LoadCP(collection as List<CPVILLE>)
            ComboBoxIdCP.BeginUpdate()
            ComboBoxIdCP.DataSource = collection
            ComboBoxIdCP.ValueMember = "CP"
            ComboBoxIdCP.DisplayMember = "CP"
            ComboBoxIdCP.EndUpdate()
     End Sub
     
     Private Sub reqSQL(state as Object)
            Dim list = DataLoad()
            Me.Invoke(AddressOf LoadCP, list)
     End Sub
    ce code fonctionne avec des Windows Forms, mais pas avec une autre technologie... pour ASP faut oublier, et pour WPF faut procéder autrement.

Discussions similaires

  1. Chargement trop long avec pagination
    Par nico_1 dans le forum MkFramework
    Réponses: 20
    Dernier message: 07/11/2013, 14h09
  2. Select avec bcp d'option = chargement trop long
    Par gato18 dans le forum Langage
    Réponses: 2
    Dernier message: 09/05/2012, 10h27
  3. Chargement trop long tree
    Par lil_k123 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 09/07/2007, 16h17
  4. Temps de chargement trop long pour animation légère
    Par CharlyMops dans le forum Flash
    Réponses: 1
    Dernier message: 27/09/2006, 07h13
  5. Réponses: 5
    Dernier message: 15/09/2006, 16h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo