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

Développement Windows Discussion :

[C#] multithread et gestion des exceptions


Sujet :

Développement Windows

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut [C#] multithread et gestion des exceptions
    Bonjour

    Comment gérez-vous les exceptions dans le cas d'exécution multi-thread ? Une exception qui ne serait pas gérée dans le thread dans lequel elle est levée provoquera une UnhandledException. Il faut donc obligatoirement la traiter dans ce thread. Mais comment faire pour avertir l'utilisateur (par une messageBox par exemple) ?

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    tu l'a dit toi meme il y a un moyen de catcher les UnhandledException sur un thread en "handlant" l'event associé sur le thread.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Disons que je me demandais s'il y avait un autre moyen que de laisser ce type d'exception être levée. Mais allons-y avec ça.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Bon, pas sûr que ça fonctionne dans mon cas. Mon application est en WPF et voici ce que j'ai trouvé ici : http://msdn.microsoft.com/fr-fr/libr...exception.aspx

    Il est dit :

    Si une exception n'est pas gérée sur un thread interface utilisateur (UI) d'arrière-plan (thread avec son propre Dispatcher) ou un thread de travail d'arrière-plan (thread sans Dispatcher), l'exception n'est pas envoyée au thread d'interface utilisateur principal.Par conséquent, la DispatcherUnhandledException n'est pas levée.Dans de tels cas, vous devrez écrire le code pour effectuer les opérations suivantes :

    1. Gérer des exceptions sur le thread d'arrière-plan.
    2. Distribuer ces exceptions au thread d'interface utilisateur principal.
    3. Lever à nouveau des exceptions sur le thread d'interface utilisateur principal sans les gérer afin de permettre la levée de la DispatcherUnhandledException.
    Donc si j'ai bien compris, il faut que je gère l'exception dans mon thread. Puis que je la fasse remonter vers l'interface. Bref que je définisse mon propre événement UnhandledException.

    Je vais voir ce que ça donne.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 047
    Points : 12 074
    Points
    12 074
    Par défaut
    Ou faire en sorte que le thread ne soit pas un thread d'arrière-plan.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Disons que si je lance un traitement en arrière plan c'est qu'il y a une raison . Le but étant d'éviter de bloquer l'UI pendant son exécution (qui peut durer plusieurs minutes).

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 047
    Points : 12 074
    Points
    12 074
    Par défaut
    Il y aussi une raison pour le fait que le caractère "arrière plan" d'un thread n'ait strictement rien à voir avec LE thread d'IHM principal.

    Le caractère "arrière plan" sert justement à différentier les threads faisant une tâche dont le succès est primordial (rien à voir avec le fait d'afficher une IHM) des threads faisant une tâche annexe comme le remplissage d'un cache.

    Il n'y a pas qu'un thread qui n'est pas en "arrière plan" mais tous ceux dont le traitement est crucial.

    Vous pouvez même avoir des threads graphiques en arrière plan. Ne mélangez pas SVP.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Ok. Dans ce cas, comment exécuter mon thread pour qu'il ne soit pas "arrière-plan" sachant qu'actuellement je l'exécute comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ThreadStart starter = delegate {
             camera.takeBulbPicture(exposure, interval, mirrorLockupDelay);
    };
    new Thread(starter).Start();
    camera étant une DependencyProperty

    Détails ici :

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 047
    Points : 12 074
    Points
    12 074

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Ok, merci.

    Mais ça n'a pas l'air de fonctionner, même avec IsBackground à false (valeur par défaut d'ailleurs).

    Dans ma classe App (Application) j'ai ajouté :

    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
     
    protected override void OnStartup(StartupEventArgs e)
            {
                base.OnStartup(e);
     
                DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);
     
              //...
                window.Show();
            }
     
            void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
            {
                e.Handled = true;
                MessageBox.Show("test DispatcherUnhandledException");
            }
    Mais j'ai toujours une UnhandledException si une exception est levée dans ma méthode takeBulbPicture

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 047
    Points : 12 074
    Points
    12 074
    Par défaut
    DispatcherUnhandledException ???

    Non, c'est plutôt AppDomain::UnhandledException
    http://msdn.microsoft.com/fr-fr/libr...exception.aspx

  12. #12
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 216
    Points : 248
    Points
    248
    Par défaut
    Je ne voudrais pas dire de bêtise donc arrêtez moi si je me trompe… mais est-ce qu'il ne serait pas plus simple de passer par un gestionnaire d'événements, gestionnaire qui posséderait deux méthodes :
    • Une pour ajouter un événement
    • Une pour dépiler un évenement de la pile

    Ainsi, ton thread ajouterait un événement dans la pile au moment de l'exécution et ton programme principal regarderait de temps à autre dans la pile d'événements pour voir s'il n'y a rien à traiter.
    Chen norris
    C/C++, C#, Java, PHP & SQL coder
    Web developer

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

Discussions similaires

  1. [ADOConnect] gestion des exception en tout temps
    Par portu dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/04/2005, 20h01
  2. [ORACLE 9i] Gestion des exceptions
    Par sygale dans le forum SQL
    Réponses: 6
    Dernier message: 19/08/2004, 16h06
  3. Gestion des exception (EOleException)
    Par shurized dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/06/2004, 18h25
  4. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 18h48
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 15h11

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