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 :

[VB.NET] [Thread] Freeze de l'interface lors d'une serialisation longue


Sujet :

VB.NET

  1. #1
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Points
    4 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Par défaut [VB.NET] [Thread] Freeze de l'interface lors d'une serialisation longue
    Bonjour,

    Voici ma procédure pour désérialiser un fichier pour retrouver l'arborescence d'une treeview :
    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
       Private Sub ChargeTreeView(ByVal TreeView As TreeView, ByVal FileName As String)
     
            Dim fichier As New FileStream(FileName, FileMode.Open)
            Dim serialiser As New BinaryFormatter
     
     
            ListeNoeuds = serialiser.Deserialize(fichier)
     
            With TreeView
                For Each node As TreeNode In ListeNoeuds
                    .BeginInvoke(New TN_Delegate(AddressOf .Nodes.Add), New Object() {node})
                Next
            End With
     
            fichier.Close()
        End Sub
    Donc en fait, j'ai passé cette procedure en thread. Mais le poroblème c'est que comme le fichier est gros (et oui car j'ai comme mm pres de 50 000 noeuds à désérialiser), l'interface utilisateur se bloque pendant un cours instant qui est de 7 secondes (temps pour effectuer la désérialisation)

    J'ai essayer en passant l'ajout des noeuds en beginupdate mais rien a faire ca bloque toujours !!!

    PS: Comme je n'ai qu'un seul noeud racine, le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     For Each node As TreeNode In ListeNoeuds
                    .BeginInvoke(New TN_Delegate(AddressOf .Nodes.Add), New Object() {node})
                Next
    n'est appelé qu'une seule fois

    Aidez moi car vraiment c'est très embétant de bloquer toute l'application sans meme pouvoir dire à l'utilisateur que ca charge...

    Thanks ALL

  2. #2
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Points
    4 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Par défaut
    Je pense que ce n'est pas la désérialisation mais le chargement des valeurs dans le treeview qui freeze l'interface. Donc si c'est bien le cas, pas de solution sauf tenter de le charger par petit bout. L'utilisateur verra alors le chargement progressif.

  3. #3
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Points
    669
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Par défaut
    Ce ne serait pas plutôt "ChargeTreeView" qu'il faudrait appeler dans une autre thread ?

  4. #4
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Points
    4 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Par défaut
    Citation Envoyé par Kelpan
    Ce ne serait pas plutôt "ChargeTreeView" qu'il faudrait appeler dans une autre thread ?
    C'est ce qu'il a fait non !?

  5. #5
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Points
    4 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Par défaut
    oui elle est deja passée en thread et tu as raison c'est bien le chargement des noeuds dans la treeview qui est longue ! Mais comment faire pour éviter le blocage... j'ai essayer en chargeant petit à petit ca marche mais alors dans mon programme c'est quasiment infaisable.

    En tout cas merci... une autre idée ?

  6. #6
    Membre régulier

    Inscrit en
    Décembre 2004
    Messages
    85
    Points
    104
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 85
    Points : 104
    Par défaut
    J'avais un problème similaire avec une listview, que j'ai resolu en remplacant le addItem par un addRange (un tableau d'item). En fait, au lieu de charger un par un chaque item, il charge un tableau d'item contenant deja tous les items. Donc dans une boucle, tu remplit d'abord ton tableau, et apres tu l'envoies a la listview

    L'equivalent existe pour les treeview: TreeView1.nodes.addRange

    PS: je ne sais pas ce que ca va donner pour des miliers de noeuds....

  7. #7
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Points
    669
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Par défaut
    Citation Envoyé par jab
    C'est ce qu'il a fait non !?
    Désolé, la fatigue surement...

    J'ai quand même une solution à te proposer :

    Tu n'utilises pas de thread, mais l'instruction DoEvents

    Code vb.net : 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 ChargeTreeView(ByVal TreeView As TreeView, ByVal FileName As String)
     
            Dim fichier As New FileStream(FileName, FileMode.Open)
            Dim serialiser As New BinaryFormatter
     
            ListeNoeuds = serialiser.Deserialize(fichier)
     
            With TreeView
                For Each node As TreeNode In ListeNoeuds
                    .Nodes.Add(node)
                    Application.DoEvents
                Next
            End With
     
            fichier.Close()
    End Sub

    @+

  8. #8
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Points
    4 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Par défaut
    pas d'interet car il passe dans la boucle que une seule fois !!!
    Je vais essayer la methode avec addrange et je vous en dirais plus...

  9. #9
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Points
    4 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Par défaut
    Citation Envoyé par Kelpan
    Tu n'utilises pas de thread, mais l'instruction DoEvents
    Méfie toi de DoEvents. Généralement, cela ralenti très fort les processus. Le thread est bien plus performant mais plus difficile à mettre en oeuvre. Bien que ici ce ne soit pas le problème.

  10. #10
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Points
    4 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Par défaut
    le probleme avec la methode nodes.addrange c'est que moi lors de la déserialisation, je récupere qu'un seul noeud qui contient tous l'arborescence de la treeview. Je ne peux donc pas mettre les noeuds un par un dans un tableau de nodes... enb fin je crois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ListeNoeuds = serialiser.Deserialize(fichier)
    'récupere le noeud

  11. #11
    Membre régulier

    Inscrit en
    Décembre 2004
    Messages
    85
    Points
    104
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 85
    Points : 104
    Par défaut
    ah ben oui effectivement, si tu n'envoie qu'un seul noeud a la treeview qui contient les autres noeuds, le addrange ne te servira surement a rien...

    Tu nous as trompé avec ta boucle qui ne boucle pas ! lol

    Ben, je pense que ya pas trop de solutions.... ya trop de noeuds dans ta treeview

  12. #12
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Points
    4 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Par défaut
    lol il a comme meme fallu que je mette un point d'arret pour comprendre qu'il n'y avais qu'un seul noeud

    Bah oui tans pis, une fois le programme installé sur le PC bah le chargement ne dure plus que 3 secondes au lieu de 7 en mode debug donc ca paasse encore

    Merci à tous

Discussions similaires

  1. Bloquer interface lors execution d'un thread
    Par Mattorre dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 25/06/2010, 11h26
  2. [Freeze Swing et Threads] Freeze lors d'un appel
    Par Tuxico dans le forum EDT/SwingWorker
    Réponses: 1
    Dernier message: 02/11/2008, 16h53
  3. [VB.NET] thread interrompu lors d'une fermeture de form ?
    Par HULK dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/01/2006, 16h00
  4. [VB.NET] Thread
    Par nico-pyright(c) dans le forum ASP.NET
    Réponses: 5
    Dernier message: 03/11/2004, 19h32
  5. [VB.NET] Threads et paramètres
    Par moufles03 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/10/2004, 18h36

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