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 :

Erreur bizarre APRES la fin du programme


Sujet :

C#

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut Erreur bizarre APRES la fin du programme
    Bonjour,

    Depuis ce matin, il m'arrive un truc bizarre. Quand je ferme mon programme développé en C#, je ramasse une erreur au moment où le code sort du Main.

    {"Impossible d'appeler Invoke ou BeginInvoke sur un contrôle tant que le handle de fenêtre n'a pas été créé."}

    à System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
    à System.Windows.Forms.Control.BeginInvoke(Delegate method, Object[] args)
    à System.Windows.Forms.WindowsFormsSynchronizationContext.Post(SendOrPostCallback d, Object state)
    à System.Windows.Forms.AxHost.ConnectionPointCookie.Finalize()

    Vu que ça passe après le Application.Run() de ma Form principale, comment pourrais-je faire pour trouver l'origine du problème ?

    Papy !

  2. #2
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Ca ressemble à une ressource qui devrait être proprement fermée avec un Dispose() mais qui ne l'est pas...

    Comment termines-tu ton programme ? Est-ce que tu nettoies les ressources non-managées avant de terminer l'application ?
    In my experience, any attempt to make any system idiot proof will only challenge God to make a better idiot.

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Je ferme mon programme de façon tout à fait classique en appelant FormMain.Close(). Et je n'ai aucune ressource non managée. Enfin, pas que je sache. Dès que le code arrive sur l'accolade fermante de ma procédure Main, ça déclenche l'erreur. J'ai le choix de continuer et si je clique sur Oui, l'application de ferme. Si ça ne se produisait qu'en dev, ça serait un moindre mal mais ça se produit même en dehors de C# avec un beau message d'erreur microsoft. J'ai mêm essayé de mettre mon Application.Run() dans un try catch pour essayer de comprendre mais l'erreur se déclenche après

  4. #4
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Si c'est du Winforms, il y a forcément des ressources non-managées.

    A vu de nez, je dirais que le problème vient d'une Form créée et fermée sans Dispose() qui détecte la fermeture de la Form principale et qui tente de nettoyer, mais trop tard (c'est une supposition, pas une certitude).

    Essais d'ajouter ce code dans ta Form principale pour voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    private void On_FormClosing(object sender, FormClosingEventArgs e)
    {
      this.FormClosing -= new FormClosingEventHandler(On_FormClosing);
      Application.Exit(e);
    }
     
    private void On_FormClosed(object sender, FormClosedEventArgs e)
    {
      this.FormClosed -= new FormClosedEventHandler(On_FormClosed);
    }
    In my experience, any attempt to make any system idiot proof will only challenge God to make a better idiot.

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    J'ai eu récemment un cas similaire, à cause d'une fenêtre que l'on pouvait fermer avant qu'un thread ne se termine; donc, bien évidemment le Invoke fait par le thread à la fin de son exécution se plantait.

    Problème résolu en gérant l'event HandleDestroyed, et en positionnant une variable membre que je teste avant d'appeler le Invoke.

    Tu n'aurais pas un thread qui deviendrait brutalement orphelin et qui s'en facherait très fort qui traine quelque part ?

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    this.FormClosing -= new FormClosingEventHandler(On_FormClosing);

    euh, Je pige pas trop ce code. C'est bien un -= qu'il faut faire ?

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Tu n'aurais pas un thread qui deviendrait brutalement orphelin et qui s'en facherait très fort qui traine quelque part ?
    Je n'utilise pas le threading dans ce programme. Juste 1 timer qui affiche l'espace libre sur le disque dur toutes les 5 minutes. J'utilise aussi un backgroungworker mais seulement sur appel d'une fonction particulière. Et l'erreur se déclenche sans rien faire. Je démarre l'appli, je la referme, le code sort du Application.Run() et affiche l'erreur.

  8. #8
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par Papy214 Voir le message

    euh, Je pige pas trop ce code. C'est bien un -= qu'il faut faire ?
    Oui, mais laisse tomber ça pour le moment, c'était une suggestion un peu à l'arrache.

    Vu ton dernier message, est-ce que tu peux nous montrer le code de chargement de ta Form principale ?
    In my experience, any attempt to make any system idiot proof will only challenge God to make a better idiot.

  9. #9
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Je n'utilise pas le threading dans ce programme. Juste 1 timer qui affiche l'espace libre sur le disque dur toutes les 5 minutes. J'utilise aussi un backgroungworker mais seulement sur appel d'une fonction particulière. Et l'erreur se déclenche sans rien faire. Je démarre l'appli, je la referme, le code sort du Application.Run() et affiche l'erreur.
    Je pense que ton problème vient ou du timer ou du BackGroundWorker.

    Je te suggère une chose très simple :

    D'abord déclare une variable membre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private bool _handleDestroyed = false;
    Cable l'event HandleDestroyed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void MyForm_HandleDestroyed(object sender, EventArgs e)
    {
    _handleDestroyed = true;
    }
    Puis, dans le code de ton timer et/ou d'appel de ton backgroun worker test la variable _handleDestroyed.

    Je pense que cela a une chance de régler ton problème. (tout au moins, je pense que la solution se situe par là).

    Déjà en mettant un breakpoint sur l'event handleDestroyed tu verras bien si ton problème se produit après (ce que je subodorre).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  10. #10
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Déjà en mettant un breakpoint sur l'event handleDestroyed tu verras bien si ton problème se produit après (ce que je subodorre).
    Le problème est bien déclenché après (j'ai mis un point d'arrèt pour vérifier). Tout le code défile, avec tous les Dispose() nécessaires. En allant pas à pas avec F11, tout va bien jusqu'à la sortie du Run. J'ai même tenté de mettre un GC.Collect après cette ligne mais rien n'y fait. J'utilise une librairie de contrôles Telerik. Je commence à me demander si ça ne viendrait pas de leur coté.

  11. #11
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Le problème est bien déclenché après (j'ai mis un point d'arrèt pour vérifier). Tout le code défile, avec tous les Dispose() nécessaires. En allant pas à pas avec F11, tout va bien jusqu'à la sortie du Run. J'ai même tenté de mettre un GC.Collect après cette ligne mais rien n'y fait. J'utilise une librairie de contrôles Telerik. Je commence à me demander si ça ne viendrait pas de leur coté.
    Possible.

    Fais quand même un autre truc : dans l'event handler de HandleDestroyed, désactive le BGW et le Timer.

    Si cela se produit toujours, c'est que la librairie que tu utilises est mal désigné de ce point de vue.

    Le GC.Collect ne sert absolument à rien ici, les Handle sont non managés.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  12. #12
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par Keihilin Voir le message
    Vu ton dernier message, est-ce que tu peux nous montrer le code de chargement de ta Form principale ?
    J'ai pas trop le droit et de toutes façons, c'est un code à rallonge. J'ai d'abord une procédure qui fait tout un tas de tests, qui vérifie la base de données, qui initialise log4net, qui lit des paramètres dans la bdr, qui selon les paramètres, demande un login ou pas, etc... Ensuite, jepasse dans le code de la Form principale avec du code dans le contructeur, dans le Shown et dans le Load. Je crains que ça ne soit pas trop parlant

  13. #13
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Fais quand même un autre truc : dans l'event handler de HandleDestroyed, désactive le BGW et le Timer.
    Ca ne change rien. J'ai même essayé de faire un Controls.Remove() des 3 controles visuels principaux liés à cette librairie de composants mais résultat négatif aussi.

    Je vais pas vous ennuyer plus longtemps. Je vais déjà envoyer un mail au support technique de cette librairie et voir si par hasard ils n'auraient pas une idée.

    Merci à vous deux ...

  14. #14
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Ca ne change rien. J'ai même essayé de faire un Controls.Remove() des 3 controles visuels principaux
    Le Controls.Remove ne fait que supprimer le lien de parenté; il n'a pas d'influence directe sur le cycle de vie des objets (il enlève juste une référence).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  15. #15
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Je suis revenu à la version précédente des contrôles supplémentaires et tout est rentré dans l'ordre.

    Merci encore à tous les deux

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

Discussions similaires

  1. Runtime.getRuntime().exec exécute le processus après la fin du programme Java
    Par scalande dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 14/02/2012, 17h56
  2. erreur à la fin du programme
    Par adel25 dans le forum SL & STL
    Réponses: 2
    Dernier message: 22/02/2009, 10h50
  3. Erreur de fin de programme
    Par Sygénème dans le forum Scheme
    Réponses: 7
    Dernier message: 21/06/2008, 19h22
  4. Réponses: 6
    Dernier message: 22/11/2007, 22h45
  5. Désactiver les messages d'erreur de Fin de programme
    Par spynux dans le forum Windows XP
    Réponses: 4
    Dernier message: 12/09/2007, 20h03

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