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

Dotnet Discussion :

Un bug inexplicable


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    soa
    soa est déconnecté
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 51
    Par défaut Un bug inexplicable
    Bonsoir

    Alors je rencontre actuellement un problème avec une petite application et dont je n'arrive pas du tout à expliquer la raison. Je vous explique.

    Imagine une classe singleton (manager), qui sert à gérer des messages d'alerte, warning et d'information, un logger en fait mais qui en plus affiche éventuellement les messages à l'écran dans une boite.
    Ces info sont traitées par une classe se chargeant de générer les graphismes et d'afficher la forme finale à l'écran. En soit c'est pas bien compliqué.

    Le problème:

    -J'ai voulut rajouter un thread au niveau de la classe manager (singleton) pour vérifier en boucle si un nouveau message à été rajouté à la liste et donc faire appel aux traitements pour l'afficher à l'écran. Rien. Rien ne n'affiche .

    - J'ai laissé tomber l'idée d'un thread séparé, j'ai donc choisi un timer dans la classe manager. Rien non plus .

    Ce qui est bizarre, c'est que si je place ce timer dans une autre classe, p.ex une forme quelconque avec juste un bouton pour rajouter des messages à la liste à afficher, ben ca marche les messages s'affichent. Alors que dans les 2 cas le timer exécute exactement la même méthode présente dans le manager.

    Alors je me suis dit, qu'il doit y avoir une couille avec mon singleton, et que le GC a du passer par là. Ben non, tout semble ok, pas de nullpointexception, les ressources imageset autres sont bien chargés et tout et tout.


    Le truc qui m'a tué et ceci.
    Comme expliqué avant si je place un timer dans la classe manager, les messages ne s’affiche pas, la forme n'apparaît pas à l'écran.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        ...
        MessageForm.Show();
    }
    Par contre avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        ...
        MessageForm.Show();
        MessageBox("blabla")
    }
    Avec ca ma forme apparaît bien à l'écran.

    C'est quoi ce délire?????
    (La forme semble quand même planter car il y a le sablier constamment. Mais au moins elle s'affiche.)

    En gros:
    - si j'appelle la méthode pour afficher les messages, à partir d'une autre classe que manager ca passe tout fonctionne sans problème du tout.

    - si je rajoute une ligne de code de type MessageBox, ma forme apparaît (plante, mais elle apparait)


    Je n'y comprends plus rien du tout.


    Vous auriez un avis pour aiguiller ma recherche de bug, car là je m'arrache les cheveux .

    Merci

  2. #2
    soa
    soa est déconnecté
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 51
    Par défaut
    Bon quelques précisions.

    J'ai mis en commentaire quelque bout de coude ne gardant que le strict nécessaire.

    Timer dans le singleton Manager, qui appel une méthode locale qui ne contient plus qu'un appel de méthode de la classe qui va me générer les graphismes.
    Cette dernière méthode ne contient elle-même qu'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FormX x = new FormX();
    formX.show();
    FormX, étant une forme vide qui ne contient qu'un bouton.


    Et qu'est-ce qui arrive? Ben ca bug aussi. La forme apparaît mais le bouton reste blanc. La forme plante.

    Bon sang, le timer en gros ne fait qu'appeler une formX, sans rien d'autre et ca plante.

    C'est à rien y comprendre. Il y a quoi avec les timer sous .Net que je n'ai pas compris??? Problème de thread?

  3. #3
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour, voilà ma supposition.

    Tu as tenté de manipuler directement des contrôles/forumlaires WinForms depuis un autre thread (le callback du timer est exécuté sur un autre thread) et, là, une exception a été levée puisqu'on n'a pas le droit de faire ça directement (il faut passer par Control.Invoke). L'exception a malheureusement été interrompue par le débogueur qui s'est contenté de la loguer dans la sortie du programme (vérifie l'onglet ouput pour t'en assurer ; menu Debug > Exceptions pour changer ce comportement).

  4. #4
    soa
    soa est déconnecté
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 51
    Par défaut
    Merci pour ta réponse.

    J'ai rien dans le output. Néanmoins il est fort probable que ce soit bien un problème de thread.

    Car en fait j'ai utilisé dans la classe manager par mégarde un timer de type: System.Timers.Timer

    Je viens de tester avec un timer de type System.Windows.Forms.Timer
    et avec celui là ca marche. Perdu une journée à cause de ca .

    Néanmoins mon erreur n'était finalement pas si mauvaise que ca . Caser un timer de type System.Windows.Forms.Timer dans une classe non UI c'est quand même pas propre.
    Je vais voir comment fonctionne les System.Timers.Timer en détails, car finalement à la base je voulais bien faire tourner certaines méthode du manager dans un thread séparé.

  5. #5
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    La seule différence essentielle entre les deux c'est le thread sur lequel est exécuté le callback : pour celui de WinForms, c'est le thread UI alors que pour celui de System.Timer c'est un thread du thread pool. A part ça les deux reposent in fine sur les WM_TIMER.

    Utiliser un System.Timers.Timer n'est donc pas une erreur en soi, ça peut être la bonne solution. Simplement les contrôles WinForms ne peuvent y être manipulés que par l'intermédiaire de Control.Invoke.

  6. #6
    Membre confirmé Avatar de wizad
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 103
    Par défaut
    Sans en voire plus voici ce qui pourrait expliquer ton comportement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FormX formX = new FormX();
    formX.show();
    Ici tu crée ta forme et l'affiche : ok. Par contre "formX.Show()" ne bloque pas l'execution donc comme tu es dans une méthode, celle-ci se termine et donc la variable x est détruite. Du coup ta fenêtre disparait. Celà se fesant rapidement tu as l'impression que ta fenêtre n'est jamais ouverte.

    Si tu mets une MessageBox, l'affichage de celle-ci bloque l'execution et du coup ta fenêtre est visible mais figé (execution bloqué par la messageBox).

    Dans ton cas tu devrais essayer d'utiliser formX.ShowDialog();

Discussions similaires

  1. Réponses: 7
    Dernier message: 07/04/2014, 15h55
  2. Bug inexplicables
    Par steelspirit dans le forum SAS Base
    Réponses: 5
    Dernier message: 24/04/2008, 09h43
  3. Bug anim flash inexplicable
    Par nicobug dans le forum Flash
    Réponses: 8
    Dernier message: 06/04/2007, 15h27

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