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

Windows Forms Discussion :

[C# 2.0][PPC][UPDATE] Problème de mémoire


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Roach-
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Par défaut [C# 2.0][PPC][UPDATE] Problème de mémoire
    Je ne sais pas pourquoi mais rendu a un endroit (souvent lorsque l'utilisateur fait la mpeme action répétitivement. Le programme plante car il n'y a plus assez de mémoire. Sur l'émulateur il me donne un choix pour fermer un application (aucune de superflu) et dans la device comme tel tout ferme et cela me dit que je n'ai pas assez de mémoire.

    Comment je fait pour libérer la mémoire du garbage collector.

  2. #2
    Membre confirmé Avatar de Roach-
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Par défaut
    ...

  3. #3
    Membre confirmé Avatar de Roach-
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Par défaut
    Malheureusement j,ai toujours les problème d'insifisance de mémoire sur le pockedt pc. Je ne vois vraiment pas ou est le problème, en se moment il plante l'orsqu'il choisi le bon panel selon une donné qui est dans la db (.sdf). SI la donné est FWD il ouvre le panel des questions pour une voiture a traction. Si c'est RWD il ouvre le panel pour les voitures à propulsion aison de suite.

  4. #4
    Membre confirmé Avatar de Roach-
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Par défaut
    EDI : VS 2005
    CF : 2.0
    PPC : HP 2410 64mb de mémoire
    (38mb pour les programmes dont 10mb déja utilisé par le ppc)
    (21mb pour le stockage de donné + sd de 512mb contenant le .sdf)

    J'ai fait plurieurs test afin de voir comment la mémoire du ppc réagit. J'ai fait un application ppc avec seulement deux forms, la premiere contenant une liste de section prit d'une table qui est dans un database (.sdf). Le second form donne une liste d'item selon la section prit de la même db. Le .sdf pèse 500k l'or de la replication. Il est sauvegarder directement sur un sd card de 512mb.

    La mémoire du pocketpc aloué au programme est à 27 à 29mb en moyenne, lorsque l'application start la mémoire dessend à plus ou moin 20mb. Je trouve cela beaucoup pour le peux que l'application fait. En terme de donner illload a peut près 100 item dans le form pricipale et un douzaine dans le second form, normalement il y aura beaucoup plus d'item (entre 500 et 1000).

    Lorsque je change de form j'ai mit System.GC.Collect; suivi de Close();, pour que le form principale ferme après avoir loader le second. Même chose pour le second form ver le principale, le second ferme après avoir loader le principale.

    Voici comment je load le form secondaire et ferme le principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            private void btnSelectAuct_Click(object sender, EventArgs e)
            {
                int selectedIndex = dtgridAuction.CurrentRowIndex;
                CarListing newForm = new CarListing();
                newForm.showDetail(dataSetInfosalvage, selectedIndex, dataTableAuct.DefaultView);
                System.GC.Collect();
                Close();
            }
    Et voici comment je load le form principale et ferme le secondaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            private void menuItem3_Click(object sender, EventArgs e)
            {
                Main newForm = new Main();
                newForm.openGoodTab();
                System.GC.Collect();
                Close();
            }
    Les forms se ferme bien 'En théorie' car si je part du principale vers le second et ferme le second le principale n'est plus la et l'application ferme. Si je ne met pas le le Close(); le form principale apparait lorsque je ferme le second. Donc dans ma tête il libère la mémoire vu qu'il ferme le form en question. En plus du System.GC.Collect(); qui est suposer vider tout se qui n'est pas utiliser. Cependant si je vais dans la gestion de la mémoire du pocket pc et dans l'onglet Progr. exécuté je vois les forms lister la. Si j'ai fait 10 fois l'allé retour du form principale au second (pour tester) et bien il y a 10 fois le form principal et 10 fois le form secondaire lister un après l'autre dans l'ordre d'exécution. Donc si je me fit à la gestion de mémoire, la mémoire n'est pas libérer se qui mange la mémoire, au bout d'un certain temps lorsqu'il n'y a plus de mémoire disponible l'application plante disant qu'il n'y a pas assez de mémoire disponible pour exécuter l'action demendé.

    L'erreur apparait toujours lors de l'ouverture d'un connection sql, mais pas toujours la même. J'ai vérifier et tout les connexions (seulement 2 dans ce teste) sont fermer au bon temps dans un finally. J'utilise SqlCnx.Dispose(); pour ête certain de tout flusher ainsi que la connexion. Deplus je met aussi le System.GC.Collect(); pour vraiment être certain que la mémoire est vider de se qui est inutile.

    Donc à ce moment je me pose de sérieuse questions ...

    1. Est ce que j'ai louper quelque chose ???
    2. Est ce qu'il y a un problème avec le Garbage Collector du cf 2.0 ???
    3. Est ce possible de fermer un form a partir d'un autre ???
    Explication :
    Dans le code plus haut j'ai mit le close() après avoir loader le
    second form. Donc il est possible que le close() ne soit pas exécuter.
    Si c'est le cas c'est pour cela que la mémoire n'est pas libérer. Alors
    je doit le fermer a partir du form loader pour ainsi vider la
    mémoire et ferme le from inutilisé. Mais comment


    Désolé pour le roman, mais je crois être claire
    Votre aide serait très apprécier, car la je ne comprend plus...

  5. #5
    Membre confirmé Avatar de Roach-
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Par défaut
    Est ce que je suis assez claire ??? Si vous avez besoin d'autre information n'hésiter pas.

  6. #6
    Expert confirmé
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Par défaut
    Bon alors plusieur points :

    1)Ne jamais utiliser GC.Collect() c'est une trés mauvaise habitude : http://blog.developpez.com/index.php...&c=1&tb=1&pb=1
    2)Vérifier que tu fais bien les Dispose() nécéssaires
    3)Tu dis que tu lis des infos dans une base de données, comment procède tu ?

    Si tu utilise un dataset tu va forcément consommé de la mémoire, surement qu'une structure plus simple (classe maison) avec un datareader pour remplir tout ça consomerait moins de mémoire.

  7. #7
    Membre confirmé Avatar de Roach-
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Par défaut
    ok

    1. Normalement je ne l'utilise pas le GC.Collect(), je viens de tous les enlever de l'application.

    2. Tous les dispose sont bien a leur place.

    3. Oui j'utilise un dataset qui fill un dataadapter, et dans le finally je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                    dataAdapterInfoVehList.SelectCommand.Dispose();
                    dataAdapterInfoVehList.Dispose();
    Est ce que tu aurais un exemple de class maison avec un datareader qui rempli un datagrid ???

    Merci de prendre du temps.

  8. #8
    Expert confirmé
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Par défaut
    Ben une classe simple :
    -Un constructeur
    -Des membres privés (le nom de tes colonnes)
    -Des propriétés pour accéder à tes membres privés.

    ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    instanceA classA;
    connection.open();
    reader = command.ExecuteReader();
    while (reader.read())
    {
       instanceA= new classA();
       instanceA.ColumnA=reader[0];
       instanceA.ColumnB=reader[1];
       ListInstanceA.Add(instanceA);
    }
    reader.close();
    connection.close();
    ListInstanceA est une liste générique de instanceA.


    bon c'est du .NET live trés mal codé juste pour t'expliquer le concept hein

  9. #9
    Membre confirmé Avatar de Roach-
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Par défaut
    Ok merci je vais esseyer comme cela.

  10. #10
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Et si simplement tu détruisais tes instances de Dataset...

    Si a chaque nouvelle instance de form tu généres un dataset....
    Courage !!!!!

  11. #11
    Membre confirmé Avatar de Roach-
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Par défaut
    Si il existe je le détruit avant de le remplacer.


    A voter avis des les procédure stocké peuvent t'elle sauver une certaine quantité de mémoire ou cela ne changera rien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Crystal Report]Problème de mémoire avec le moteur RDC
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/05/2005, 09h09
  2. [Update]Problème update Eclipse
    Par tomate dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 05/04/2005, 11h14
  3. [Update] Problème ds ma requete
    Par dai.kaioh dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/02/2005, 11h28
  4. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

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