private void Form1_Load(object sender, System.EventArgs e)
{
StartToFillTree();
}
private void StartToFillTree()
{
try
{
tvFolders.Nodes.Clear();
tvFolders.Nodes.Add(new TreeNode("Loading", -1, -1));
Thread explorerThread = new Thread(new ThreadStart(FillTreeInAnotherThread));
explorerThread.Start();
}
catch (Exception exc)
{
//Do the catch
}
}
private void FillTreeInAnotherThread()
{
try
{
CreateTree(this.tvFolders);
}
catch (Exception exc)
{
//Do the catch
}
}
public void ClearTreeview(TreeView tv)
{
tv.Nodes.Clear();
}
public void AddNodeToTreeview(TreeView tv, TreeNode node)
{
tv.Nodes.Add(node);
}
public void CreateTree(TreeView treeView)
{
try
{
TreeNode hoofdNode = new TreeNode("NodeNam", 0, 0);
AddDrivesToHoofdNode(hoofdNode); //This method takes 1 ms
//This part takes 905 milliseconds if I can believe my profiler !!?? -----
if(treeView.InvokeRequired)
{
treeView.Invoke(new ClearTreeviewDelegate(this.ClearTreeview), new object[] { treeView });
treeView.Invoke(new AddNodeToTreeviewDelegate(this.AddNodeToTreeview), new object[] { treeView, hoofdNode });
}
else
{
treeView.Nodes.Clear();
treeView.Nodes.Add(hoofdNode);
}
//End of 900ms part ?? -----
AddFavorieteFolders(treeView);//This method takes 1 ms
}
catch (Exception ex)
{
//Do some catching
}
}
Répondre
Tout d'abord, pourquoi utilisez-vous des threads pour quelque chose d'aussi simple? Il a l'air un peu sur-conçu. Mais vous ne nous montrez peut-être pas tout?
enveloppent également les modifications TreeView avec:
treeView.BeginUpdate();
// modify the tree here.
treeView.EndUpdate();
Pour obtenir de meilleures performances.
Vous avez raison ... Je commençais un autre thread pour ajouter 1 nœud à un treeview .. :-) un peu trop :-) (il avait grandi au fil des années) ... Il faut maintenant 1 ms pour terminer. Merci. –
np. arrive le meilleur de nous;) – jgauffin
Vous ne pouvez pas mettre à jour les composants de l'interface utilisateur en dehors du thread d'interface utilisateur. Tous ces appels Invoke remettent les mises à jour dans le thread de l'interface utilisateur, ce qui permet de sérialiser à nouveau votre application.
Une approche typique des grands arbres consiste à charger uniquement les nœuds enfants lorsque le parent est développé plutôt que d'essayer de remplir tout l'arbre au début.
Vous avez raison. J'ai enlevé le fil supplémentaire. Merci. –
InvokeRequired prend du temps pour faire son travail. Voir this. Spécialement "Si le handle du contrôle n'existe pas encore, InvokeRequired recherche la chaîne parente du contrôle jusqu'à ce qu'il trouve un contrôle ou un formulaire qui possède un handle de fenêtre Si aucun descripteur approprié ne peut être trouvé, la méthode InvokeRequired retourne false." Cela prend donc du temps
Merci pour la référence. –
Appelez-vous BeginUpdate
sur votre contrôle TreeView
avant de supprimer et d'ajouter de nouveaux nœuds, puis d'appeler EndUpdate
lorsque vous avez terminé d'ajouter des nœuds? Si vous ne faites pas ces appels, votre TreeView
essaiera de se repeindre après chaque nœud ajouté - manquant cela peut faire que le code qui est autrement très bien fonctionner extrêmement lentement, en particulier lorsque vous ajoutez un grand nombre de nœuds.
Merci pour le point. Astuce très utile – fedotoves
Oublié cela aussi. Merci pour le conseil. –
- 1. Pourquoi cette méthode C segfaulting?
- 2. Pourquoi cette méthode générique est-elle dangereuse?
- 3. Convertir millisecondes à NSDate
- 4. Comment remplir cette ressource JRDataSource?
- 5. Liste synchronisée pour l'application filetée
- 6. Millisecondes à l'horodatage UNIX
- 7. convertir millisecondes valeur à ce jour?
- 8. Pourquoi cette méthode lance-t-elle une exception IllegalMonitorStateException?
- 9. Pourquoi cette méthode de page échoue-t-elle?
- 10. Pourquoi cette méthode n'imprime-t-elle pas son texte? (Java)
- 11. Pourquoi cette méthode retourne-t-elle toujours zéro?
- 12. mySQL: comment remplir cette questions - réponses Table
- 13. Pourquoi cette méthode ActiveRecord déclenche-t-elle une erreur NameError?
- 14. récursive + 900 éléments + voisin check = causes stackoverflow
- 15. Une méthode de conversion en millisecondes plus efficace?
- 16. Font-weight CSS plus épais que 900?
- 17. Vérificateur de proxy Python, passage à la version filetée
- 18. Erreurs avec Indy dans l'application filetée!
- 19. Clé primaire MySql> 900/1000 octets?
- 20. Mettre en pause une méthode pour l'ensemble Nombre de millisecondes
- 21. Comment optimiser cette méthode
- 22. Pourquoi cette division aboutit à zéro?
- 23. toJSON "L'objet ne supporte pas cette propriété ou cette méthode"
- 24. Pourquoi ai-je cette exception simplejson?
- 25. Django: remplir le formulaire de méthode get
- 26. Pourquoi cette fonction segfaulting?
- 27. Pourquoi cette Time.parse ne
- 28. Comparaison des dates en millisecondes
- 29. millisecondes dans mysql
- 30. Convertir millisecondes à ce jour (en Excel)
Pourquoi avez-vous des blocs de prises vides? C'est une mauvaise pratique. Mieux vaut ne pas attraper une exception que de l'avaler silencieusement. – Oded
J'attrape les erreurs, mais juste enlevé le code pour faciliter la lecture ici :-) –