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

Windows Presentation Foundation Discussion :

Interface bloquée malgré multi-thread


Sujet :

Windows Presentation Foundation

  1. #1
    Invité
    Invité(e)
    Par défaut Interface bloquée malgré multi-thread
    Bonjour

    Je développe une application (WPF + C#) devant me permettre de contrôler un appareil photo à distance. Jusqu'à présent pas de problème, j'arrive à déclencher des poses.
    Maintenant je voudrais lancer la prise de vue dans un thread séparé pour éviter de bloquer l'interface utilisateur pendant une longue pose. J'ai tenté 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
     
    //méthode Execute d'une classe implémentant ICommand
    //vm est le ViewModel lié au datacontext de ma vue
    public void Execute(object parameter)
    {
        Action dispatchAction = () =>
        {
            //méthode exécutant la prise de vue sur l'appareil connecté
            vm.SelectedCamera.takeBulbPicture(vm.bulbTime);
        };
     
        ThreadStart start = delegate() {
            vm.Dispatcher.Invoke(DispatcherPriority.Normal, dispatchAction); 
        };
     
        new Thread(start).Start(); 
    }
    Mais cela ne fonctionne pas. La prise de vue est bien exécutée mais l'interface reste bloquée. Qu'ai'je fait de faux ?

  2. #2
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Si ma mémoire est bonne (des fois on se demande), il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Action dispatchAction = () =>
        {
            //méthode exécutant la prise de vue sur l'appareil connecté
            vm.SelectedCamera.takeBulbPicture(vm.bulbTime);
        };
     
    vm.Dispatcher.BeginInvoke(DispatcherPriority.Normal, dispatchAction);

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ça ne fonctionne pas mieux. Pourtant ça correspond bien à différents exemples que j'ai pu trouver.

    Pour être sur que le problème ne vienne pas de ma méthode takebulbpicture j'ai fait une méthode test tournant en boucle avec un sleep toutes les 100 ms, mais le résultat est le même. Vraiment bizarre.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Personne n'a une idée de ce qui peux bloquer ?
    Je cherche, je cherche... mais franchement je ne vois pas pourquoi ça ne fonctionne pas.

  5. #5
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Le dispatcher de "vm" correspond à celui du thread UI ?
    Si oui le comportement observé est normal.

    Il faudrait alors subdiviser le traitement de la pose afin d'alléger les traitements envoyés au thread UI via le dispatcher.

  6. #6
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Tu peux essayer le composant BackgroundWorker qui permet de gérer plus facilement des traitments dans un thread séparé:
    http://glarde.developpez.com/dotnet/bgworker/cs/
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  7. #7
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Hum ça ne devrait à priori pas régler le problème, mais c'est à essayer.

    Le souci semble vraiment venir de la pose elle-même qui bloque l'UI; la changer de thread ne devrait rien améliorer.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par seriousme Voir le message
    Le dispatcher de "vm" correspond à celui du thread UI ?
    vm est une instance de ma classe ViewModel. Elle est lié au datacontext de ma vue. Elle est passé au constructeur de ma commande.

    Citation Envoyé par seriousme Voir le message
    Il faudrait alors subdiviser le traitement de la pose afin d'alléger les traitements envoyés au thread UI via le dispatcher.
    Qu'est ce que tu veux dire par subdiviser le traitement ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    C'est bon, j'ai compris. Grâce à ce topic : http://www.developpez.net/forums/d79...ltithread-wpf/

    Ma nouvelle méthode execute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    vm.SelectedCamera.Properties.SerialPortName = vm.SelectedSerialPortName;
    vm.SelectedCamera.Properties.SerialPortMode = vm.SelectedSerialPortMode;
    uint exposure = vm.CurrentExposureTimeMinutes * 60 + vm.CurrentExposureTimeSeconds;
    uint interval = vm.CurrentInterval;
    uint mirrorLockupDelay = vm.CurrentMirrorLockupDelay;
    ICamera camera = vm.SelectedCamera;
     
    ThreadStart starter = delegate {
             camera.takeBulbPicture(exposure, interval, mirrorLockupDelay);
    };
    new Thread(starter).Start();
    et dans mon viewModel j'ai encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void SelectedCamera_OnBulbExposureTime(DslrLib.ICamera sender, BulbExposureTimeEventArgs e)
    {
        Action dispatchAction = () => ElapsedTime = e.ExposureTime;
        Dispatcher.BeginInvoke(DispatcherPriority.DataBind, dispatchAction);
    }
    OnBulbExposureTime est un évènement déclenché par l'appareil. Il me permet d'afficher la durée de pose écoulée

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

Discussions similaires

  1. JWindow grisée malgrè le multi-threading
    Par Guiyaume260 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 06/05/2014, 21h33
  2. [MEX] interface et multi thread
    Par gpcbitnik38 dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 12/07/2013, 10h00
  3. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  4. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01
  5. [Kylix] exception qtinft.dll et multi-threading
    Par leclaudio25 dans le forum EDI
    Réponses: 3
    Dernier message: 27/03/2003, 18h09

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