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

C# Discussion :

Découper un tache longue pour visu de l'avancement sur un ProgressBar


Sujet :

C#

  1. #1
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 935
    Points : 2 013
    Points
    2 013
    Par défaut Découper un tache longue pour visu de l'avancement sur un ProgressBar
    Bonjour

    Dans un windowsForm, je charge des gros fichiers CSV dans des Listes (une List par champ dans le CSV) pour pouvoir les traiter plus rapidement par la suite. Chaque liste reprend la date qui est dans le premier champ du CSV.

    Le code (qui fonctionne très bien) donne ceci :
    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
    while (!MonFichier.EndOfStream) //tant que je ne suis pas à la fin du fichier
    {
    	string ligne = MonFichier.ReadLine();         // lecture d'une ligne
    	tabCSV = ligne.Split(';');                    // récupération du tableau de string avec chaque contenu entre ;
     
    	string[] FormatsDates = new string[8] { "dd/MM/yyyy", "d/M/yyyy", "dd/MM/yyyy HH:mm:ss.fff", "d/M/yyyy HH:mm:ss.fff", "dd/MM/yyyy HH:mm:ss", "d/M/yyyy HH:mm:ss", "dd/MM/yyyy HH:mm", "d/M/yyyy HH:mm" };//formats possible de date
     
    	double date = DateTime.ParseExact(tabCSV[0], FormatsDates, null, System.Globalization.DateTimeStyles.None).ToOADate();
     
    	index = index - NbChamps + 1;
    	for (int y = 1; y < NbChamps; y = y + NombreDeChampParParametre)
    	{
    		try
    		{
    			Valeur = Convert.ToDouble(tabCSV[y], CultureInfo.InvariantCulture);
    		}
    		catch
    		{
    			break;
    		}
     
    		MesList[index].Add(new MyClassSerie { myDate = date, myValeur = Valeur });
    		index++;                        
    	}                
    }
    Mon soucis est que je ne vois pas comment gérer un avancement avec ça ;
    la boucle principale s’exécute plus de 2 millions de fois sur un tache super rapide...
    Si je calcule autant de fois un pourcentage d'avancement mon chargement va devenir 2 ou 3 fois plus long !

    Comment puis-je gérer autrement mon chargement afin de savoir où j'en suis dedans ?

    Merci par avance pour vos conseils.

    PS : ne pas hésiter à démonter mon code ! S'il y a moyen d'aller plus vite pour charger le fichier je suis preneur...
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 35
    Points : 47
    Points
    47
    Par défaut
    Bonjour,

    il est vrai que je ne sais pas si c'est possible de connaitre le nombre de ligne sans avoir... parcouru le fichier.

    Je te propose de calculer ton chargement en fonction du poids du fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      FileInfo f = new FileInfo(@"tonPath/tonFichier.csv");
                long tailleDeMonFichier=f.Length;
    Cela va te donner un nombre en octet. À chaque boucle tu incrémentes le nombre d'octets en récupérant le nb d'octets chaque ligne (ligne.GetBytes()), Et à chaque fin de ligne tu regarde si le nombre total atteint le 100e de la taille totale du fichier. Si c'est le cas, tu incrémentes un multiplicateur pour que le prochain pallier soit 2%, etc...

    Maintenant si veux optimiser, est que ton fichier est assez "régularisé" (tu arrives à estimer la taille globale d'une ligne), tu peux t'enlever ces vérifications et le faire au nombre de lignes ( (poids du texte/100) / poids d'une ligne = nb approximatif de ligne pour faire 1%).


    Arnaud DS

Discussions similaires

  1. Tache ant pour SFTP
    Par Rayley dans le forum ANT
    Réponses: 1
    Dernier message: 22/08/2007, 09h21
  2. Réponses: 7
    Dernier message: 11/09/2006, 18h45
  3. Tache planifiée pour statspack
    Par joziel dans le forum Oracle
    Réponses: 2
    Dernier message: 08/06/2006, 11h28
  4. Créer un tache crom pour redemarrer un serveur Mandrake
    Par crumbles34 dans le forum Administration système
    Réponses: 6
    Dernier message: 29/11/2005, 10h10
  5. chaine trop longue pour envoyer en socket?
    Par jeje.r dans le forum C++Builder
    Réponses: 10
    Dernier message: 27/06/2003, 16h36

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