Charger un fichier sans bloquer la forme

Passepoil75 Messages postés 30 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 17 septembre 2009 - 4 sept. 2008 à 21:40
Passepoil75 Messages postés 30 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 17 septembre 2009 - 12 sept. 2008 à 13:53
Bonjour,

J'ai une liste de contrôles qui doivent charger chacun un fichier et j'utilise un délégué afin de charger en parallèle.

Par contre, la forme bloque jusqu'à ce que tous les fichiers soient chargés.

Est-ce qu'il y a une solution à mon problème?

Merci d'avance,

Pascal

12 réponses

Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
4 sept. 2008 à 21:47
Salut,
Un délégué ne suffit pas pour "charger en parallèle", il faut faire du multi-threading.
Tu peux utiliser un BackgroundWorker pour facilement créer un 2ème thread.
Mais attention, il n'est pas possible d'accéder à un contrôle depuis un autre thread que celui dans lequel il à été créé, tu peux toutefois créer une mise en forme à tes données avant de les renvoyer au thread principal pour les rajouter à tes contrôles..
0
Passepoil75 Messages postés 30 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 17 septembre 2009
4 sept. 2008 à 22:02
Merci de l'information.

Je connais assez bien le BackgroundWorker et comme tu le dis, je ne peux associé mes contrôles au contrôle parent.

Peux-tu me parler un peu plus de la mise en forme... ou un exemple?

Merci 
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
4 sept. 2008 à 22:39
Tu peux faire la lecture du fichier dans le BackgroundWorker, et si tu as un traitement à faire aux données avant de les ajouter à tes contrôles (c'est ça que j'appel la mise en forme), également le faire dans le BackgroundWorker. Une fois que tu as tes données formatés (par exemple un tableau se String), tu peux les envoyer au thread principal pour les ajouter à tes contrôles.

Mais souvent le problème ne vient pas du temps de chargement du fichier ou du formatage des données, mais du temps mis pour ajouter les items à une ListView par exemple. Dans ce cas, vu que l'ajout à une ListView n'est pas possible depuis un autre thread, tu as 2 solutions:

- Un DoEvents entre chaque ajout d'item
- Utiliser le mode "VirtualMode" de la ListView

Que contiennent tes fichiers? Dans quel genre de contrôles ajoutes-tu ces données?
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
5 sept. 2008 à 11:45
pour faire simple, un Application.DoEvents bien plaçé suffit généralement

Bonjour chez vous !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Passepoil75 Messages postés 30 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 17 septembre 2009
5 sept. 2008 à 12:52
Kevin.Ory,

Le problème, c'est que je n'ai aucun traitement à faire.  Ce sont des fichiers Html, DOC ou d'un autre type perso qui sont affichés dans un contrôle perso.
Les seules lignes de codes sont :

      ControlViewer.path_file = monFichier
      ControlViewer.LoadFile()

Je peux avoir jusqu'à 10-12 contrôles qui se chargent en même temps.
0
Passepoil75 Messages postés 30 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 17 septembre 2009
5 sept. 2008 à 14:50
Est-ce possible de créer mes contrôles sur un 2e Thread et ensuite, lorsque .IsAlive = False, venir ajouter mes contrôles à mon contrôle parent de ma forme?
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
5 sept. 2008 à 15:43
pourquoi ne pas mettre une form avec un progressbar et un message ?

Bonjour chez vous !
0
Passepoil75 Messages postés 30 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 17 septembre 2009
5 sept. 2008 à 15:52
gillardg,

l'application doit être rapide à charger afin que l'utilisateur puisse débuter son travail le plus tôt possible.

Merci quand même de la suggestion.
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
6 sept. 2008 à 00:40
Re,
Si je comprend bien, tu n'as pas la source de ton ControlViewer?
Si tu as les sources, il est peut être possible d'améliorer le chargement du fichier, mais si ce n'est pas le cas tu n'as pas le choix.
Mais impossible de créer tes contrôles dans un deuxième thread puis les ajouter à ton formulaire principal (qui lui à été créé dans le 1er thread). Bon, je ne suis pas sûr à 100% de ce que j'avance, j'avais bien cherché sans rien trouver, mais je ne suis pas allé jusqu'à demander une confirmation à Microsoft Je ne connais pas assez bien le fonctionnement interne de Windows pour affirmer quoi que ce soit, peut être existe-t-il une astuce pour permettre le passage de contrôle entre les threads.
Tu peux essayer, même si je doute très fortement que cela fonctionne, d'appeler la méthode LoadFile depuis un autre thread, voir ce que ça donne.

Sinon, comme déjà dit, une boucle avec un DoEvents pour ne pas complètement bloquer l'interface pendant le chargement. Cela permet de plus ou moins travailler sur les interfaces déjà chargées pendant que les autres se chargent encore. Et sinon la barre de progression n'est pas forcément inutile, elle permet de distraire l'utlisateur pendant le chargement

En même temps, si on prend comme exemple Visual Studio: Sur mon vieux PC, le chargement d'un projet prend plusieurs longues secondes (j'ai presque envie de dire des 10aines de secondes pour un projet assez conséquent), et il se trouve que mon interface est complètement bloqué durant ce temps de chargement => le multithreading peut être utile, mais ne résout pas tout.
0
Passepoil75 Messages postés 30 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 17 septembre 2009
8 sept. 2008 à 13:26
J'ai la source du ControlViewer par contre, je voulais m'éviter d'entrer dans le code qui a été programmé par un autre.

Je crois que je n'aurai pas le choix.

Merci de votre aide.

Pascal
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
8 sept. 2008 à 21:41
Il sert à quoi ce ControlViewer?
Puisque c'est sensiblement lent, je suppose que lui fait pas mal de traitement sur les données du fichier, car un fichier html est rarement lourd...
Et dans ce cas, tu peux effectivement créer un chargement/traitement multi-threadé

Il ne faut pas négliger la possibilité de traiter les données qu'une fois qu'elles sont affichées, et non lors du chargement du programme (du style VirtualMode des ListView)
0
Passepoil75 Messages postés 30 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 17 septembre 2009
12 sept. 2008 à 13:53
Bon, pour l'instant j'ai laissé tombé, je vais charger chacun des documents à la demande de l'utilisateur.

Si j'ai du temps, je m'attaquerai au traitement multi-thread dans le ControlViewer.

Merci de ton aide

Pascal
0
Rejoignez-nous