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ébutant]Astuce pour optimizer.


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 192
    Points : 160
    Points
    160
    Par défaut [Débutant]Astuce pour optimizer.
    Salut , j'ai récemment entamé la réalisation d'un " Patcheur de Client". un petit programme qui sert a appliquer des patch sur les ressources d'un jeu.

    J'ai rencontré pas mal de problèmes, plus syntaxique que logiques, et de ce fait j'ai du entre << tourner autour de l'objet pour faire en sorte que ca se passe comme je veut (utilisation de constante pour remédier a des indexes out of bounds)

    Bon, Donc si quelqu'un a un peu de temps, j'aimerais avoir des tips, pour optimiser mon code pour que ca run plus rapidement bien sure mais aussi que ce soit plus vite. ne vous fatiguer pas, juste ce qui est trés connu !
    Mais avant, j'ai deux-3 questions importantes :

    1.J'ai une Forme (GUI) et mon programme dans d'autre classes/unités.
    J'aimerais que mon programme ne commence a s'exécuter qu'après que toutes les membres de la forme soit chargé et visible.
    Dans quel événement dois je poser mon programme ? j'ai essayé le Shown, mais ca commence apres le chargement de FORM1 Tout seul, sa n'attend pas les autres.

    2.J'ai une question sur le comportement de StreamWriterInstance.ReadToEnd.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //EVENT LOG Entry
               File.CreateText(Application.StartupPath + @"\event_log.txt").Close();
               StreamReader logevent1 = new StreamReader(Application.StartupPath + @"\event_log.txt");
               String tempText = logevent1.ReadToEnd();
               logevent1.Close();
               tempText += logwut;
               StreamWriter logevent = new StreamWriter(Application.StartupPath + @"\event_log.txt");
               logevent.Write(tempText);
    Ca m'a l'air correcte mais ce n'est pas le cas, a la fin je ne retrouve que le Dernier évènement, et non pas les évènement précèdent + le nouvel.
    pourtant d'après mon code, je met tout le fichier dans un string temporaire et j'ajoute un "messageici \n"

    3.J'ai une joli progress bar que je n'arrive pas a faire marcher.
    j'espérerais qu'a .NET, le pays des merveilles et des choses faciles qu'on devait juste la rattacher a une méthode
    mais ce n'est pas le cas. j'aimerais y mettre par exemple le progrès d'un telechargement. si quelqu'un pouvait m'éclairer.


    Bon sinon pour la fin, voila mes deux petites feuilles :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Net;
    using System.Windows.Forms;
     
    namespace PATCHERV3
    {
        public class Patch
        {
           public Patch(string IDZ, string INDEXZ, string COMEN)
            {
                int a = 0, b= 0; string c;
                a = int.Parse(FILEIO.Patch_Params[0]); //ID Set ok!
                if (FILEIO.Patch_Params[1].ToString().ToLower().Trim() == "server") b = 0;
                else if (FILEIO.Patch_Params[1].ToString().ToLower().Trim() == "images") b = 1;
                else if (FILEIO.Patch_Params[1].ToString().ToLower().Trim() == "sprite") b = 2;
                else System.Windows.Forms.MessageBox.Show("Critical : Tell Rehael to fix this mess quickly at \n <a href="mailto:a.rehael@gmail.com">a.rehael@gmail.com</a> use MSN or email", "CRITICAL ERROR", MessageBoxButtons.OK);
                //Index Set OK!
                c = FILEIO.Patch_Params[2];
                PatchIt(b);
                LogItin(a,LogIt(a,c));
     
            }
     
           static void PatchIt(int index) //Constructor
           {
               //Stored ID for log entry.
               //Starting index treatement.
               String filename = null;
               switch (index)
               {
                   case 0: { filename = "server.bin"; break; }
                   case 1: { filename = "images.bin"; break; }
                   case 2: { filename = "sprite.bin"; break; }
               }
               WebClient dlfile = new WebClient();
               Uri url = new Uri("http://valiantro.com/vpatch/" + filename);
               dlfile.DownloadFile(url, Application.StartupPath + @"\grf\" + filename);
     
           }
     
           static string LogIt(int IDa, string commentaire)
           {
               String Entry = "#" + IDa + " : " + commentaire+"\n";
               return(Entry);
           }
     
           static void LogItin(int IDb,string logwut)
           {
               File.Delete(Application.StartupPath + @"\pdata\id.bin");
               StreamWriter refreshID = new StreamWriter(Application.StartupPath + @"\pdata\id.bin");
               refreshID.WriteLine(IDb.ToString());
               refreshID.Close(); //ID UPDATED
     
               //EVENT LOG Entry
               File.CreateText(Application.StartupPath + @"\event_log.txt").Close();
               StreamReader logevent1 = new StreamReader(Application.StartupPath + @"\event_log.txt");
               String tempText = logevent1.ReadToEnd();
               logevent1.Close();
               tempText += logwut;
               StreamWriter logevent = new StreamWriter(Application.StartupPath + @"\event_log.txt");
               logevent.Write(tempText);
               logevent.Close();
           }
        }
    }
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Net;
    using System.Windows.Forms;
     
    namespace PATCHERV3
    {
     
        public static class FILEIO
        {   //Settings
         public   static string[] CRCs = new string[4];
         public   static bool Allow_Patch = true;
            //Variables
     
            public static string[] Patch_Params = new string[3];
            //Methods
            static int returnID() 
            {
                if (!File.Exists(Application.StartupPath + @"\pdata\id.bin"))
                {
                    StreamWriter id_wr = new StreamWriter(Application.StartupPath + @"\pdata\id.bin");
                    id_wr.Write("0");
                    id_wr.Close();
                    return 0;
                }
                else
                {
                    StreamReader id_rd = new StreamReader(Application.StartupPath + @"\pdata\id.bin");
                    String TempS = id_rd.ReadLine();
                    id_rd.Close();
                    return(int.Parse(TempS));
                }
            } 
          public  static void read_settings()
            {
                String file_path = Application.StartupPath + "\\pdata\\setting.cfg";
                RefreshData.downloadfiles();
                StreamReader set_rd = new StreamReader(file_path);
                for (Int16 n = 1; n <= 2; n++)
                {
                    String Temp_Setting = set_rd.ReadLine();
                    Temp_Setting = Temp_Setting.Substring(Temp_Setting.IndexOf("=") + 1).Trim().ToLower(); //Selects setting only.
                    switch (n)
                    {
                        case 1: { if (Temp_Setting == "false") Allow_Patch = false; break; }
                        case 2: { CRCs[0] = Temp_Setting; break; } //Sets CRC For Client.
                    }
                }
                set_rd.Close(); //Closed.
            } //First Method to start
          public  static void read_plist() 
            {
                StreamReader Plist = new StreamReader(Application.StartupPath + @"\pdata\patchlist.php");
                String Temp_String = "no patch";
                while (true)
                {
                try{
                    Temp_String = Plist.ReadLine().Trim();
                    }catch{break;}
                if (int.Parse(Temp_String.Substring(1, Temp_String.IndexOf(",") - 1)) > returnID())
                {
                    Patch_Params[0] = Temp_String.Substring(1, Temp_String.IndexOf(",") - 1); //Setting ID param
                    Patch_Params[1] = Temp_String.Substring(Temp_String.IndexOf(",") + 1, 6); //Setting Index String
                    Patch_Params[2] = Temp_String.Substring(Temp_String.IndexOf(":") + 1);//Comment param
                }
                else break;
                    Patch patch1 = new Patch(Patch_Params[0], Patch_Params[1], Patch_Params[2]);
     
                }
                Plist.Close();
     
            } // Second Method
        }
            static class RefreshData
            {
                public static void downloadfiles()
                {
                    String path = Application.StartupPath + @"\pdata";
                    try
                    {
                        Directory.CreateDirectory(path);
                    }
                    catch
                    {
                        MessageBox.Show("Not Enough Rights, use administrator account", "Rights Error !", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    if (File.Exists(Application.StartupPath + "\\setting.cfg") || File.Exists(Application.StartupPath + "\\patchlist.txt")) { File.Delete(Application.StartupPath + "\\patchlist.txt"); File.Delete(Application.StartupPath + "\\setting.cfg"); }
                    WebClient dl_files = new WebClient();
                    String url = "http://valiantro.com/vpatch/";
                    Uri uri = new Uri(url + "setting.cfg");
                    dl_files.DownloadFile(uri, path + "\\setting.cfg");
                    uri = new Uri(url + "patchlist.php");
                    dl_files.DownloadFile(uri, path + "\\patchlist.php");
                    dl_files.Dispose();
     
                }
     
     
     
            }
        }
    Merci beaucoup !

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 150
    Points : 152
    Points
    152
    Par défaut
    Salut,

    Pour ce qui est d'optimiser ton programme utilise ant profiler. Ce dernier va indiquer les méthodes, classes et morceaux de code qui prennent le plus de temps à s'éxécuter. Ensuite il te reste plus qu'a chercher ce qui est trop lent et optimissable.

    POur ce qui ets de tes questions:

    1. Je ne comprend pas trop ton probleme, si tu veux que ton code s'execute après le chargement de tes composants appel le dans le constructeur de la form après l'appel de la methode InitializeComponent.

    2. Pour ton problème de streamWriter, passe au constructeur un boolen indiquant si tu veux pouvoir ajouter à la suite du contenu (append).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StreamWriter sx = New StreamWriter(myFile,True);
    Avec ceci, tu écrira à la suite du contenu au lieu de l'ecraser.


    3. Pour ta progressbar, il te suffit de definir une taille maximun, correspondant à la taille totale de ton téléchargement et a chaque fois que la taille téléchargé augmente tu renseigne la propriété Value avec celle-ci.
    Je en suis pas sur que cela marche encore comme ca car ma dernière progressBar remonte au framework 1.1

    Voila j'espère t'avoir aidé

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 192
    Points : 160
    Points
    160
    Par défaut
    Citation Envoyé par Spaeda Voir le message
    Salut,

    Pour ce qui est d'optimiser ton programme utilise ant profiler. Ce dernier va indiquer les méthodes, classes et morceaux de code qui prennent le plus de temps à s'éxécuter. Ensuite il te reste plus qu'a chercher ce qui est trop lent et optimissable.

    POur ce qui ets de tes questions:

    1. Je ne comprend pas trop ton probleme, si tu veux que ton code s'execute après le chargement de tes composants appel le dans le constructeur de la form après l'appel de la methode InitializeComponent.

    2. Pour ton problème de streamWriter, passe au constructeur un boolen indiquant si tu veux pouvoir ajouter à la suite du contenu (append).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StreamWriter sx = New StreamWriter(myFile,True);
    Avec ceci, tu écrira à la suite du contenu au lieu de l'ecraser.


    3. Pour ta progressbar, il te suffit de definir une taille maximun, correspondant à la taille totale de ton téléchargement et a chaque fois que la taille téléchargé augmente tu renseigne la propriété Value avec celle-ci.
    Je en suis pas sur que cela marche encore comme ca car ma dernière progressBar remonte au framework 1.1

    Voila j'espère t'avoir aidé
    Merci, je n'avais pas remarqué que StreamWriter avait tellement de constructeurs.

    Sinon quelqu'un pourait nous renseigner sur la progress bar?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 150
    Points : 152
    Points
    152
    Par défaut
    Voila pour ta progress bar :

    1. Tu spécifie la valeur max via ProgressBar.Maximum
    2. A chaque fois que tu dois augmenter la progression tu renseigne le champ ProgressBar.Value

    Voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ProgressBar pb = new ProgressBar();
    FileInfo myFile = new FileInfo("filepath");
    pb.Maximum = MyFile.Length;
    Ensuite, tu catch un evenement qui interviendrai à chaque fois que le téléchargement avance et tu augmente ta progressBar.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private void ProgressDownload(double fileSize)
    {
        //ProgressBar definie dans ta form (ici pb)
        pb.Value = fileSize;
        pb.Update();
    }

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 192
    Points : 160
    Points
    160
    Par défaut
    oula, alors j'ai encore le premier probleme.
    Malgrés le fait que j'ai mis mon code qui doit commencer dés que tout les composant de la forme sont afficher, ca ne marche pas comme je veut, parceque malgrés le fait que InitialiseComponent Run deja et soit fini, mon code qui vient juste apres empeche le constructeur d'arriver a son End.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 150
    Points : 152
    Points
    152
    Par défaut
    Ok donc dans ce cas je vois 2 posibilités :
    1. Mettre un bouton pour lancer ton code, dans ce cas c'est l'utilisateur qui devra effectuer le lancemen de ton action.
    2. Faire un programme MultiThread. Tu execute ton programme dans un thread différent de ton application. Dans le thread principal (celui de ton application, tu gère ta form et ses elements (progressBar, image, etc....)) et dans le thread secondaire (celui que tu as crée) tu gère tout ton code.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par F.Saad Voir le message
    1.J'ai une Forme (GUI) et mon programme dans d'autre classes/unités.
    J'aimerais que mon programme ne commence a s'exécuter qu'après que toutes les membres de la forme soit chargé et visible.
    Dans quel événement dois je poser mon programme ?

    Normalement, tous les formulaires ont un évènement déclenché lorsque l'initialisation graphique est terminée : Load.

    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
     
    //Constructeur
    public MonForm()
    {
         InitializeComponent();
     
         //renseignement de l'event
         this.Load = this.MonForm_Load;
    }
     
    //Méthode appelée après l'initialisation complète de la fenêtre
    private void MonForm_Load(object sender, EventArgs e)
    {
         //Code a effectuer après chargement de la fenêtre...
    }
    Swann

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 150
    Points : 152
    Points
    152
    Par défaut
    Effectivement, j'avais oublié l'evenement Load de la form.

    Par contre chose, qu'il faut savoir c'est que tant que ton code n'aura pas fini de s'executer l'application sera figé. Donc si ton code est assez long en execution opte plus pour le multithreading.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 192
    Points : 160
    Points
    160
    Par défaut
    Citation Envoyé par Spaeda Voir le message
    Effectivement, j'avais oublié l'evenement Load de la form.

    Par contre chose, qu'il faut savoir c'est que tant que ton code n'aura pas fini de s'executer l'application sera figé. Donc si ton code est assez long en execution opte plus pour le multithreading.
    mon code implique un gros telechargement, et le multithreading sa sonne un peu difficile non?

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 150
    Points : 152
    Points
    152
    Par défaut
    Non du tout, en cherchant un peu tu trouveras des exemples et des tutos.
    Voici un tuto present sur developpez :
    http://emerica.developpez.com/csharp/threads/

Discussions similaires

  1. astuces pour un Débutant dans windows serveur 2003
    Par geroma dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 20/06/2009, 16h20
  2. [débutant] gotoandstop pour revenir ?!?
    Par ajor dans le forum Flash
    Réponses: 13
    Dernier message: 27/09/2007, 16h55
  3. Réponses: 4
    Dernier message: 22/09/2004, 09h17
  4. [Débutant] JFontChooser pour JinternalFrame...
    Par doudine dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 10/08/2004, 12h02
  5. Réponses: 3
    Dernier message: 14/02/2004, 10h10

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