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 :

Programme C# qui ne s'arrête pas - comment débugguer?


Sujet :

C#

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Par défaut Programme C# qui ne s'arrête pas - comment débugguer?
    Bonjour,

    J'ai un problème dans mon programme C# en Framework 3.5. J'utilise un timer qui lance à intervalles réguliers une procédure importante.
    A la fermeture de l'application, je stoppe le timer.
    Souvent, lorsque j'arrête l'application, l'éditeur Visual Studio 2008 ne me rend pas la main, et même lorsque j'utilise mon programme en dehors de Visual Studio, la tâche ne se ferme pas lorsque j'éteins le programme, et même en patientant assez longtemps.

    Mon problème est que je ne sais pas comment retrouver ce qui crée ce problème.

    Je me demande si ce n'est pas dû à un problème d'allocation mémoire (je suis assez nouveau sur la plateforme .NET, j'étais sous Delphi 7 avant).

    Si vous avez des pistes de débuggage je vous en serai reconnaissant...

    David

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    N'aurais tu pas un thread qui tournerait et qui ne serait pas arreter à la fin de l'application ?

    En dehors de celà, je ne vois guère d'autres hypothèses !

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Par défaut
    Voila le seul thread que je lance parfois:

    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
            //*********************************************************************************************************
            //
            //
            //
            //---------------------------------------------------------------------------------------------------------
            static public void pause(int p_delai_pause)
            {
                BackgroundWorker pauseExecution = new BackgroundWorker();
     
                m_delai_pause = p_delai_pause;
     
                //-------------------------------------------------------------------------
                // Créer un nouveau worker en arrière-plan pour réaliser la tâche de pause
                //-------------------------------------------------------------------------
                pauseExecution.DoWork += COutils.pause_background;
                pauseExecution.RunWorkerAsync(); 
     
                 //-------------------------------------------------------------
                // Rafraichir l'interface jusqu'à ce que le worker ait terminé 
                //-------------------------------------------------------------
                while (pauseExecution.IsBusy)
                {
                    Application.DoEvents();
                }
     
            }
     
            //*********************************************************************************************************
            //
            // utilisé par fonction 'pause'
            //
            //---------------------------------------------------------------------------------------------------------
            static public void pause_background(object sender, DoWorkEventArgs e)
            {
                Thread.Sleep(m_delai_pause);
            }

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Si le traitement important est exécuté par un thread, vérifie que ce thread est déclaré comme background. Par défaut ce n'est pas le cas, et un thread foreground (par opposition à background) bloque la sortie tant qu'il n'a pas terminé.

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Par défaut
    Le traitement important n'est pas dans un thread, il peut lancer la fonction pause, qui elle est threadée, plusieurs fois, selon le besoin.

  6. #6
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Ca sert à quoi de "threader" un Sleep ?

  7. #7
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Par défaut
    Pour le moment c'est la seule façon que j'ai de ne pas bloquer l'affichage pendant le sleep.
    Je suis ouvert aux suggestions...

    Sinon mon interface est carrément bloquée pendant ce temps là.

  8. #8
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Personnellement, si j'avais besoin de faire une pause je pense que j'utiliserais plutôt un timer. Je fais le début du traitement et pour la pause je démarre un timer (initialisé avec la durée de pause). Quand le timer se déclenche je l'arrête et je fais le reste du traitement.

    La solution c'est de "threader" le traitement lourd. Comme ça pas besoin de pause car tu ne monopolises plus le thread principal (thread dédié à la gestion de l'affichage) et donc l'interface ne sera plus bloquée.

    Le fait d'avoir ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (pauseExecution.IsBusy)
    {
        Application.DoEvents();
    }
    est pour moi une erreur.

    Mais bon, de toute façon ce n'est pas ça qui bloque l'application à priori. Tu as essayé de couper certains blocs de code, appels de méthode, ... pour arriver à situer l'origine du problème ?

  9. #9
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Par défaut
    je vais tester ta solution pour voir ce que ça donne

    Oui je fais des logs entre chaque instruction mais ils s'affichent tous
    J'y perds mon latin ... :-)

  10. #10
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Par défaut
    En ce qui concerne le thread du traitement lourd, j'aurai quand meme besoin de cette fonction de pause qui me permet de synchroniser les actions.

    Et puis je ne suis pas encore très familier des threads malgré que (sans me vanter) je touche ma bille en dév.
    J'ai notamment peu de recul sur le partage d'informations entre le programme principal et le threads que l'on lance à coté.

  11. #11
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static public void pause_background(object sender, DoWorkEventArgs e)
    {
      Thread.Sleep(m_delai_pause);
      pauseExecution.ReportProgress(100);// OU e.ReportProgress(100);
    }

  12. #12
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Par défaut
    J'ai eu un message d'erreur tout à l'heure que voilà:

    Le CLR n'a pas pu effectuer de transition du contexte COM 0x21f6d0 au contexte COM 0x21f840 pendant 60 secondes. Le thread qui possède le contexte/cloisonnement de destination est probablement en train d'attendre ou de traiter une opération très longue sans pompage des messages Windows. Cette situation a généralement des effets négatifs sur les performances et peut parfois entraîner le blocage de l'application ou une utilisation ininterrompue de la mémoire. Pour éviter ce problème, tous les threads STA (Single Threaded Apartment) doivent utiliser des primitives d'attente de pompage (par exemple CoWaitForMultipleHandles) et pomper de manière régulière les messages lors des opérations qui sont longues à s'exécuter.
    Et en cherchant sur le Web j'ai trouvé que pour régler ça on pouvait faire un changement au niveau du main:

    Remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
            [STAThread]
            static void Main()
            {
            ..
            }
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
            [MTAThread]
            static void Main()
            {
            ..
            }
    Pour le moment je n'ai pas beaucoup de recul mais ça a l'air de fonctionner...

  13. #13
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Par défaut
    Fausse joie... :-(

Discussions similaires

  1. As typewriter qui ne s'arrête pas !
    Par Mirlipili dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 22/06/2007, 11h10
  2. [SQL] une requête qui ne s'arrête pas ou si loin
    Par lodan dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/10/2006, 14h36
  3. Lancer une tâche planifiée qui ne s'arrête pas
    Par bart64 dans le forum Windows Serveur
    Réponses: 12
    Dernier message: 02/10/2006, 19h33
  4. [FLASH MX2004] Clip qui ne s'arrête pas
    Par romain starck dans le forum ActionScript 1 & ActionScript 2
    Réponses: 8
    Dernier message: 10/05/2006, 19h43
  5. [VBA-E]une boucle qui ne s'arrète pas
    Par vivelesgnous dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/02/2006, 18h05

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