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 :

Utiliser un thread avec Timeout


Sujet :

C#

  1. #1
    Membre éclairé Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Par défaut Utiliser un thread avec Timeout
    Bonjour à tous.

    Actuellement je développe une application avec un dialogue USB.Mes fonctions de lecture de données fonctionnent bien.

    Cependant, j'aimerais les améliorer en réalisant la tache de lecture dans un thread indépendant qui me retourne soit un tableau d'octet suite à la réponse du matériel, soit une exception de lecture.

    De plus j'aimerais définir un temps de timeout si ma fonction de lecture prend trop de temps. Le timeout génère alors une exception.

    Malgré mes recherches, je ne vois pas comment implémenter ce principe de timeout sur un thread. Avez vous une idée ou une solution alternative?

    Merci de votre aide

  2. #2
    Membre Expert
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 660
    Par défaut
    Pourquoi ne pas lancer une StopWatch au début de l'execution de ton Thread ?

    Après tu fais un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (stopWatch.Elapsed.Seconds >= timeout)
    {
        // Exception
    }

  3. #3
    Membre éclairé Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Par défaut
    Je n'avais pas pensé au stopwatch

    L’implémentation pourrait être

    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
     
    Thread th = new Thread(new ThreadStart(target));
                Stopwatch sw = new Stopwatch();
                sw.Start();
                    th.Start();
                        bool timeoutflag = false;
                int mstimeout = 6000;
                do
                {
                    if (sw.Elapsed.Milliseconds > mstimeout)
                        timeoutflag = true;
                } while (!timeoutflag & th.ThreadState != System.Threading.ThreadState.Stopped);
     
                if (timeoutflag)
                {
                    th.Join(10);
                    throw new Exception();
                }
    ....
    Je vais tester ca ...

  4. #4
    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
    Ouhlà, non, surtout pas, tout ça est horrible et ne donnera pas le résultat escompté.

    La bonne façon de faire: il faut vérifier le temps depuis l'intérieur de ton thread "th". Autrement dit c'est la méthode désignée par "target" qu'il faut modifier. Si celle-ci utilise l'IO ou le réseau, il y a toujours des variantes de ces méthodes qui prennent en paramètre un timeout ou un CancellationToken.

    La mauvaise façon de faire: si vraiment tu ne peux pas modifier "target" alors ton seul recours est d'appeler Thread.Abort. Tu crées simplement un timer et au bout de 60s tu appels Abort sur le thread à annuler, puis tu arrêtes le timer. Attention ! Abort a des chances de laisser l'état des variables partagées avec ce thread corrompues et tu pourrais te retrouver avec deadlocks et compagnie.

    Ce qui ne va pas avec ta solution:
    * Sur un système monothread ton timer va bouffer la moitié du temps CPU. Et sur un portable c'est un bon moyen de vider la batterie.
    * Thread.Join ne fonctionne pas comme tu le penses: après dix secondes ton thread timer abandonnera "Join" mais "th" sera toujours en vie.
    * Pas la peine de lancer une exception pour quitter un thread, un simple "return" suffit (ou rien du tout si tu es déjà à la fin de la méthode).

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je rejoins tout à fait DonQuiche sur le principe.

    Si tu as le Framework v4 minimum, je te conseille très fortement d'utiliser la classe "Task" avec les systèmes de jeton d'annulation. Encore plus idéal serait d'être en version du Framework 4.5 pour avoir accès aux mots clés "async" et "await".

  6. #6
    Membre averti
    Homme Profil pro
    Developpeur Electronique/Info. Indus. - option bricolage
    Inscrit en
    Janvier 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Developpeur Electronique/Info. Indus. - option bricolage

    Informations forums :
    Inscription : Janvier 2007
    Messages : 26
    Par défaut
    Salut,

    Le probleme avec l'USB c'est qu'il peut arriver que Windows bloque ou le device lui meme. Personnellement j'utilise ce genre de routine (peut-etre pas formidables mais fonctionnelles). Mais je suis pas encore familiarisé avec le 4.0 donc y'a surement mieux

    Fonction d'appel :

    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
        public bool ReadFromDevice(out byte[] Buffer, int TimeOverflow = 3000)
        {
          Buffer = new byte[0];
          Thread thTmp = new Thread(thFuncRead);
          int lTime = System.Environment.TickCount;
          thTmp.Start();
          while (thTmp.IsAlive && lTime + TimeOverflow > System.Environment.TickCount) ; // Application.DovEvents(); 
          if (!thTmp.IsAlive)
          {
            Buffer = (byte[])BufferThread.Clone();
            return true;
          }
          else
          {
            thTmp.Abort();
            return false;
          }
        }
    Et ma thread de letture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private void thFuncRead()
        {
          Int32 bytesWritten;
          BufferThread = new byte[64];
          bool bResult = WinUSB_API.WinUsb_ReadPipe(_Device.winUSBHandle,
                                 _Device.bulkInPipe,
                                 BufferThread,
                                 64,
                                 out bytesWritten,
                                 IntPtr.Zero);
          if (bResult)
            Array.Resize(ref BufferThread, bytesWritten);      
        }
    Après les pipes de mes Devices sont en 64 octets. Tu adaptes en fonction des ton système.

    Pour le TimOut tu t'adapte, sachant que si ton device te répond pas dans les 100ms, en général ca sent le paté ou que tu devrais envisager (si c'est toi qui le fait) d'optimiser ton firmware sur cette commande).

Discussions similaires

  1. Utilisation de Thread avec application principale
    Par mohammed.badre dans le forum Débuter
    Réponses: 1
    Dernier message: 24/10/2012, 18h16
  2. utilisation des threads avec les ejb
    Par saylar222 dans le forum Java EE
    Réponses: 0
    Dernier message: 15/06/2012, 16h35
  3. utilisation des threads avec gtk en C sous linux
    Par zerimbak dans le forum GTK+ avec C & C++
    Réponses: 10
    Dernier message: 25/04/2011, 19h23
  4. comment on utilise les thread avec pygtk ?
    Par dkmatt dans le forum GTK+ avec Python
    Réponses: 8
    Dernier message: 03/11/2009, 15h42
  5. Utilisation des threads avec C++
    Par lolita4882 dans le forum C++
    Réponses: 4
    Dernier message: 10/11/2007, 11h25

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