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 :

Gestion de la mémoire douteux dans un thread


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 34
    Par défaut Gestion de la mémoire douteux dans un thread
    Bonjour,

    Je démarre un thread qui se termine seulement a la fin du programme dont le but est de checker si un périphérique est connecté via usb -> HID.

    J'ai tenté de 2 manières:
    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
     
              while (true)
                {
     
                    if (HidDevices.IsConnected("\\\\?\\hid#vid_1b91&pid_000a#6&1d66a16e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"))
                    {
                       ctrl.getIhm().Invoke(ctrl.getIhm().UploadDelegate, new object[] { true });
                       ctrl.getIhm().Invoke(ctrl.getIhm().EtatBarDelegate, new object[] { "Ewoo connected" });
                    }
                    else {
                      ctrl.getIhm().Invoke(ctrl.getIhm().UploadDelegate, new object[] { false });
                      ctrl.getIhm().Invoke(ctrl.getIhm().EtatBarDelegate, new object[] { "Ewoo no connected" });
                    }                                        
                    Thread.Sleep(800);
                }
    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
     
                while (true)
                {
                    HidDevices[] devices = HidDevices.Enumerate(0x1B91, 0x000A);
                    if (devices.Length > 0)
                    {
                       ctrl.getIhm().Invoke(ctrl.getIhm().UploadDelegate, new object[] { true });
                       ctrl.getIhm().Invoke(ctrl.getIhm().EtatBarDelegate, new object[] { "Ewoo connected" });
                    }
                    else {
                      ctrl.getIhm().Invoke(ctrl.getIhm().UploadDelegate, new object[] { false });
                      ctrl.getIhm().Invoke(ctrl.getIhm().EtatBarDelegate, new object[] { "Ewoo no connected" });
                    }                                        
                    Thread.Sleep(800);
                }
    Les 2 fonctionnes cependant le programme ne fait qu'augmenter en RAM. Il est possible qu'il y ait un pb avec la libraire que j'utilise: http://labs.mike-obrien.net/view.asp...tid=hidlibrary

    Est ce que qqu peut m'aider ?

  2. #2
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    Il vient d'où ton ctrl ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 34
    Par défaut
    J'ai créé une petite structure MVC. C'est pas très important, j'ai laissé la ligne pour montrer qu'il se passe un peu qqc.
    Ce qui pose problème c'est la l'accès au périphérique USB. Mais je ne vois pas bien comment faire autrement pour checker en permanence si'il est connecté

  4. #4
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    Dans ce cas, je n'ai observé aucun problème de mémoire car j'ai testé ton code sans la partie des ctrl et je ne vois rien aucune perte de mémoire.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 34
    Par défaut
    Si j'enlève les méthode invoke j'ai toujours le meme problème. Par contre un truc très étrange:

    si je test l'application sur mon PC j'arrive a 4kb environ tout les 3 ou 4 sec et si je fais le meme test sur un autre pc j'obitent des + 2, 3 Mo par seconde

    Je sais pas, si tu veux jeter un coup d'oeil a l'application je peux te l'envoyer. Elle n'est pas très grande.

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 241
    Par défaut
    Bonjour,
    je ne suis pas développeur C#, mais la question qui m'intrigue c'est:
    Si tu es tenu d'utiliser des tableaux "constants" dans tes "Invoke", pourquoi ne pas les déclarer une bonne fois pour toute? ça t'évite des allocations qui pourrait être non contrôlées, et à la limite pas de coût de construction toutes les 800 millisecondes.
    Parce que selon moi, à chaque tour de boucle, le new ... va allouer de la mémoire, même si c'est pas grand chose.

    S. Desbois

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 34
    Par défaut
    J'aurais pas vraiement du laisser les invoke. Le problème n'est pas la je viens de tester sans ces lignes et c'est pareil. Le problème provient de cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     HidDevices[] devices = HidDevices.Enumerate(0x1B91, 0x000A);
    A chaque fois j'obtiens dans la sortie la ligne: "Enumerate". J'imagine en fait que dans la librairie des objets sont créés et pas détuit.

    Je viens remarquer qqc, si j'utilise cette manière pour tester la connection:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HidDevices.IsConnected("\\\\?\\hid#vid_1b91&pid_000a#6&1d66a16e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}")
    Il n'y pas d'ajour si l'appareil n'est pas connecté. Sinon c'est pareil

  8. #8
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par alakazam
    Bonjour,
    je ne suis pas développeur C#, mais la question qui m'intrigue c'est:
    Si tu es tenu d'utiliser des tableaux "constants" dans tes "Invoke", pourquoi ne pas les déclarer une bonne fois pour toute? ça t'évite des allocations qui pourrait être non contrôlées, et à la limite pas de coût de construction toutes les 800 millisecondes.
    Parce que selon moi, à chaque tour de boucle, le new ... va allouer de la mémoire, même si c'est pas grand chose.

    S. Desbois
    Normalement le ramasse-miettes est capable de gérer cette situation, mais ça vaut peut-être le coût de vérifier, je suis d'accord.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  9. #9
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    Voila, je viens de vérifier ton code.

    Les objets HidDevices consomment des ressources, il faut donc appeler la méthode Dispose de chacun d'eux.

    Voila ce que tu peux mettre après ton if/else :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    foreach (HidDevice Hid in devices)
                        Hid.Dispose();

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 34
    Par défaut
    Ca fonctionne chez toi? Ca n'a pas corrigé le pb pour moi

    Il faudrait pouvoir forcer la suppression de l'objet. J'ai chercher un peu mais n'est rien trouvé. Est ce possible de le faire?

  11. #11
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    Personnelement ce que j'ai constaté avec le code que j'ai rajouté, c'est que la mémoire augmente lors du début de la boucle et quand on arrive au sleep et redescend et ainsi de suite. Et donc elle n'augmente plus comme avant.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 34
    Par défaut
    Ca n'a pas l'air de fonctionner. Je vais changer de librairie. Celle - ci a l'air de fonctionner: http://www.codeproject.com/useritems/USB_HID.asp

    Merci beaucoup du coup de main !

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 34
    Par défaut
    Elle permet d'utiliser un évenement lorsque l'appareil se connecte ou se déconnecte.
    Le problème avec l^'autre librairie venait de la librairie

  14. #14
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Pourquoi t'appelles plein de fois GetIhm() ?
    Pourquoi tu fais pas 1 variable au début de ton thread, que tu appelles 1 fois GetIhm(), et que tu bosse avec cette variable ?

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 34
    Par défaut
    Pourquoi t'appelles plein de fois GetIhm() ?
    Pourquoi tu fais pas 1 variable au début de ton thread, que tu appelles 1 fois GetIhm(), et que tu bosse avec cette variable ?
    Effectivement ca serait plus otpimisé comme ca. Je vais corriger. Mais l'erreur ne provient pas de la. Une simple boucle avec l'accès HID (dans mes tests) provoque le problème.

    Je vais recoder un peu l'application avec un système d'évenement.

Discussions similaires

  1. [WD10] Gestion d'un fenêtre dans un thread différent
    Par Louis Griffont dans le forum WinDev
    Réponses: 23
    Dernier message: 21/06/2010, 09h47
  2. Gestion des évènements dans un thread
    Par kashikai dans le forum SDL
    Réponses: 0
    Dernier message: 25/05/2009, 14h32
  3. Gestion d'un IdIcmpClient dans un thread
    Par yamino dans le forum Delphi
    Réponses: 3
    Dernier message: 27/12/2006, 13h21
  4. Affichage dans un thread // gestion du clavier!
    Par phraides dans le forum SDL
    Réponses: 5
    Dernier message: 08/07/2006, 12h14
  5. Gestion des message windows dans les threads
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2003, 17h25

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