Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de vitesse dans un treeview (VB.NET2005 SP1)

3 réponses
Avatar
Marc Allard
Bonjour,

Je travaille dans un programme qui remplis un Treeview avec cinq grands
noeuds (treenode), et chaque noeud contient environ 1000 éléments (soit
environ 5000 éléments en tout). Je peux reproduire ce cas en utilisant un
seul grand noeud avec 1000 enfants.

Après, le vais lire dans un fichier texte tous les noeuds qui ont été
choisis par l'utilisateur dans un autre programme. Si le texte du noeud
existe dans mon fichier texte, alors je modifies le noeud (pour dire qu'il
existe déjà). Si le texte n'est pas trouvé, je ne fais rien.

Voici comment je modifies le texte de mon node (dans un programme simplifié
pour voir d'où vient la perte de vitesse)

TreeView1.Nodes("Parent").Nodes("ID" & i).Text &= " b"

En général, presque tous les noeuds sont dans le texte.
Pour traiter 1000 éléments, il faut environ une à deux minutes (ce qui est
beaucoup trop comme j'ai environ 5000 noeuds, le client devrait attendre 10
minutes après avoir lancé le programme).

J'ai fait quelques tests, et j'ai constaté que si je fais

Dim nod_Tmp, nod_Parent As TreeNode
nod_Tmp = TreeView1.Nodes("Parent").Nodes("ID" & i)
nod_Parent = nod_Tmp.Parent
nod_Parent.Nodes.Remove(nod_Tmp)
nod_Tmp.Text &= " b"
nod_Parent.Nodes.Add(nod_Tmp)

le traitement se fait en quelques secondes (pour 1000 nodes).
Le simple fait de supprimer le noeud du treeview, puis modifier son texte,
puis de le recréer rend le programme beaucoup plus rapide.
Savez-vous si je ne fais pas quelque chose correctement? ou si c'est un
problème dans Visual Basic?


J'ai fait un projet simplifié pour reproduire le problème, mais je ne sais
pas comment le poster.


Merci
Marc
Allcomp

3 réponses

Avatar
jerome crevecoeur
Il faudrait déjà essayer de faire un:

TreeView1.BeginUpdate
<-- Ta boucle ->
TreeView1.EndUpdate

et constater le gain de temps.
Cela évite le rafraichissement de l'écran donc accélère les trait ements.

Ensuite une solution pour les Treeviews conséquents est de remplir
seulement les noeuds racines et d'ajouter les noeuds enfants sur le
click comme ça le formulaire n'est pas trop long à charger

Cordialement



Marc Allard a écrit :
Bonjour,

Je travaille dans un programme qui remplis un Treeview avec cinq grands
noeuds (treenode), et chaque noeud contient environ 1000 éléments ( soit
environ 5000 éléments en tout). Je peux reproduire ce cas en utilis ant un
seul grand noeud avec 1000 enfants.

Après, le vais lire dans un fichier texte tous les noeuds qui ont é té
choisis par l'utilisateur dans un autre programme. Si le texte du noeud
existe dans mon fichier texte, alors je modifies le noeud (pour dire qu 'il
existe déjà). Si le texte n'est pas trouvé, je ne fais rien.

Voici comment je modifies le texte de mon node (dans un programme simpl ifié
pour voir d'où vient la perte de vitesse)

TreeView1.Nodes("Parent").Nodes("ID" & i).Text &= " b"

En général, presque tous les noeuds sont dans le texte.
Pour traiter 1000 éléments, il faut environ une à deux minutes (c e qui est
beaucoup trop comme j'ai environ 5000 noeuds, le client devrait attendr e 10
minutes après avoir lancé le programme).

J'ai fait quelques tests, et j'ai constaté que si je fais

Dim nod_Tmp, nod_Parent As TreeNode
nod_Tmp = TreeView1.Nodes("Parent").Nodes("ID" & i)
nod_Parent = nod_Tmp.Parent
nod_Parent.Nodes.Remove(nod_Tmp)
nod_Tmp.Text &= " b"
nod_Parent.Nodes.Add(nod_Tmp)

le traitement se fait en quelques secondes (pour 1000 nodes).
Le simple fait de supprimer le noeud du treeview, puis modifier son tex te,
puis de le recréer rend le programme beaucoup plus rapide.
Savez-vous si je ne fais pas quelque chose correctement? ou si c'est un
problème dans Visual Basic?


J'ai fait un projet simplifié pour reproduire le problème, mais je ne sais
pas comment le poster.


Merci
Marc
Allcomp


Avatar
Marc Allard
Merci beaucoup pour votre réponse.
C'est exactement ce qu'il me fallait.
C'est encore plus rapide qu'en supprimant le node puis en le remettant.
Je suis obligé d'afficher tous les nodes car mon programme devra assigner un
ID unique dans ma base de données pour tous les nodes qui ne sont pas dans le
fichier texte.

Marc
Avatar
Bill2
Marc Allard wrote:
Merci beaucoup pour votre réponse.
C'est exactement ce qu'il me fallait.
C'est encore plus rapide qu'en supprimant le node puis en le
remettant.
Je suis obligé d'afficher tous les nodes car mon programme devra
assigner un ID unique dans ma base de données pour tous les nodes qui
ne sont pas dans le fichier texte.

Marc



autre piste
Vous avez ça dans votre code :
TreeView1.Nodes("Parent").Nodes("ID" & i).Text &= " b"

Répéter dans une boucle l'accès à TreeView1.Nodes("Parent") est "couteux"
Normalement, en mettant cet objet dans une variable, ça devrait accélerer
les choses.

dim MonNode as TreeNode = TreeView1.Nodes("Parent")
' boucle
MonNode.Nodes("ID" & i).text &="b"
'fin de boucle


Ce code "devrait" etre plus rapide.


pour faire des tests de vitesse, utiliser la classe stopWatch, qui indique
le temps d'execution, et comparer les 2 versions du programme

avant la boucle :
dim MonTimer as stopWatch = new Stopwatch
T.Sart

après la boucle :
T.stop
msgbox("Execution : " & T.ElapsedMilliseconds)

Et une autre piste :
la concaténation de chaine est gourmande en temps.
Faudrait voir si il n'y a pas moyen d'utiliser les fonctions spécifiques de
concaténation pour gagner du temps ...

un truc du style string.concat(MonNode, "b")

dim MonNode as TreeNode = TreeView1.Nodes("Parent")
Dim nod_Tmp As TreeNode

' boucle
nod_Tmp = MonNode.Nodes("ID" & i)
nod_Tmp.text=string.concat(nod_Tmp.text,"b")
' fin de boucle


mais bon, là je suis pas sûr du gain, et je suis pas sur que la MAJ de
la valeur soit bien reportée dans le treeNode, vu qu'on a stocké ça dans une
autre variable ... à vérifier donc ...
--
Bill2