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 :

mscorlib - Erreur probable de thread


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Par défaut mscorlib - Erreur probable de thread
    Bonjours,

    Ma situation est fort complexe. Nous avons un logiciel qui affiche un panneau en pleine écran avec des informations dont un texte défilant. Le texte défilant est contrôler par un objet maison sur un thread séparé. J'ai voulu ajouter à cette objet un événement TransitionCompleted qui se déclenche quand le texte à traversé l'écran au complet. J'ai reçu cette erreurs :

    ex.Message = Une exception a été levée par la cible d'un appel.
    ex.Source = mscorlib
    ex.Target = System.Object _InvokeMethodFast(blablabla)
    ex.Trace = un texte à pu finir !

    Je me suis dit que peut-être mon événement utilisait un thread différent du thread de mon texte défillant. J'ai donc "copier" le code directement dans mon objet pour tester et encore la même erreur (le texte va chercher des données sur base de données puis rafraichi le texte défillant).

    De mettre le code ici serait trop long. Ce qu'il faut comprendre c'est que j'ai à débugger ce code que je connais à peine depuis deux semaines, que c'est un projet d'environ 75k ligne de code et que je ne connais pas vraiment beacoup le fonctionnement des delegate !

    Posez des questions pour plus de détails.

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Il ne s'agit peut-être pas de donner tout le code.

    Est-ce que tu arrives à isoler la partie (la plus courte possible biensûr là où l'exception est levée au niveau de la méthode de classe) qui pose problème ?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par CIFQ_Drew Voir le message
    ex.Trace = un texte à pu finir !
    Même si c'est long, c'est une des informations les plus utiles pour résoudre le problème, donc poste la quand même...

    Poste aussi les détails de la InnerException ; ce type d'exception (TargetInvokationException) ne donne généralement aucune information utile directement, elle se contente de wrapper l'exception d'origine, accessible via InnerException

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Je ne sais pas si ce c'est la solution, mais pour modifier un composant visuel du foreground à partir du thread de background, utilise la méthode BeginInvoke() au lieu d'Invoke()

  5. #5
    Membre confirmé

    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Par défaut
    Voici la StrackTrace :

    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
     
     
    à System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
       à System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
       à System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
       à System.Delegate.DynamicInvokeImpl(Object[] args)
       à System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)
       à System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
       à System.Threading.ExecutionContexA first chance exception of type 'System.NullReferenceException' occurred in Andon-TRG.exe
    A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
    t.runTryCode(Object userData)
       à System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
       à System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
       à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       à System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
       à System.Windows.Forms.Control.InvokeMarshaledCallbacks()
       à System.Windows.Forms.Control.WndProc(Message& m)
       à System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       à System.Windows.Forms.ContainerControl.WndProc(Message& m)
       à System.Windows.Forms.Form.WndProc(Message& m)
       à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       à System.Windows.Forms.Application.RunDialog(Form form)
       à System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
       à System.Windows.Forms.Form.ShowDialog()
       à TRG100.Forms.DisplayMultiplesConfigurationForm.btnStart_Click(Object sender, EventArgs e) dans C:\Documents and Settings\...\Mes documents\Visual Studio 2008\Projects\TRG100\TRG100\Forms\DisplayMultiplesConfigurationForm.cs:ligne 104
    Je ne suis pas en mesure de debugger l'erreur (quand je mets un point d'arrêt dans ma classe (genre la méthode qui est appeller) le débuggeur n'embarque pas. De plus, j'essaie d'enlever du code pour trouver l'erreur mais je n'y arrive pas.

    Étape 1 : J'affiche mon formulaire modale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
          m_mainForm.Hide();
     
          try {
            displayMultiplesForm.ShowDialog();
          } catch (Exception ex) {
            Console.Write("Message : " + ex.Message 
                          + ".\r\nSource : " + ex.Source 
                          + ".\r\nTarget : " + ex.TargetSite
                          + ".\r\nTrace :\r\n\t" + ex.StackTrace);
          }
     
          m_mainForm.Show();
    Je construit un delegate pour faire exécuter mon objet MessageMover sur un thread différent dans mon DisplayMultiplesForm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public delegate void StartMessageMoverDelegate();
        StartMessageMoverDelegate startMessageMoverDelegate;
    Dans mon constructeur,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            startMessageMoverDelegate = new StartMessageMoverDelegate(StartMessageMover);
            startMessageMoverDelegate.BeginInvoke(null, null);
    Puis la méthode StartMessageMover :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       private void StartMessageMover() {
          m_messageMover = new MessageMover(label1, 4, this);
        }
    Ensuite, j'ai mon objet Marquee qui, avec l'aide d'un MarqueeDAO, va chercher les données dans une BD access

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MarqueeDAO dao = new MarqueeDAO();
          Marquee myMarquee = dao.ScrollingMessage;
    Marquee possède une propriété Message que je passe à MessageMover.Message (j'ai pas encore eu le temps d'arranger toutes les classes, il y a de la redondance je sais!)

    J'avais mis dans MessageMover ceci :

    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
     
            public delegate void TransitionCompletedHandler();
            public event TransitionCompletedHandler TransitionCompleted = delegate { };
     
    ...
    private void MoveMessage() {
          m_timer.Enabled = false;
     
          if (m_rightStartPos > 0) {
            m_lblMessage.Left -= 2;
            m_rightStartPos -= 2;
          } else {
            MessageMoved(this, new EventArgs());
     
            m_lblMessage.Left = m_formWidth;
     
            m_rightStartPos = m_initialWidth + m_formWidth;
     
            TransitionCompleted();
          }
     
          m_timer.Enabled = true;
        }
    Ce que je voulais, c'est cela dans le DisplayMultiplesForm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void m_messageMover_transitionCompleted() {
            MarqueeDAO dao = new MarqueeDAO();
          Marquee myMarquee = dao.ScrollingMessage;
          m_messageMover.Message = myMarquee.Message;
    }
    C'est a peu près cela.

  6. #6
    Membre confirmé

    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Par défaut
    Oui j'utilise BeginInvoke.

  7. #7
    Membre confirmé

    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Par défaut
    Le problème est règlé. J'avais une méthode MoveMessage et c'était dans cette méthode que je faisais mes test mais j'ai vu qu'il y avait maintenant un événement qui gérait à chaque tick le message au lieu de prendre la méthode. J'ai replacé mon code en conséquence et sa fonctionne a1 !

    Merci hegros, tu m'a permis de retracer le code !!!

    Bonne journée !

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

Discussions similaires

  1. [Debutante] erreur Exception in thread "AWT-EventQueue-0"
    Par mariafan dans le forum AWT/Swing
    Réponses: 16
    Dernier message: 01/02/2007, 14h38
  2. Erreur : Opération inter-threads non valide
    Par cadeau dans le forum C++/CLI
    Réponses: 1
    Dernier message: 12/12/2006, 09h07
  3. erreur:Exception in thread main
    Par milsum dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 26/07/2006, 15h34
  4. [VB.NET]Erreur "invalid cross-thread operation"
    Par NicolasJolet dans le forum Windows Forms
    Réponses: 6
    Dernier message: 05/04/2006, 12h38
  5. Pb de code d'erreur sur plantage thread
    Par mbianchi dans le forum Windows
    Réponses: 4
    Dernier message: 17/03/2006, 09h38

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