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 :

System.Threading.Timer - Attendre la fin d'un thread


Sujet :

C#

  1. #1
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut System.Threading.Timer - Attendre la fin d'un thread
    Bonjour à tous,

    J'utilise un Timer tel que :

    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
     
            static void Main(string[] args)
            {
                Api api = new Api();
                var timer = new System.Threading.Timer(api.checkApiModbus, null, 0, 200);
     
                Thread.Sleep(60000);
            }
     
     
        class Api
        {
            public void checkApiModbus(Object stateInfo)
            {
                Console.WriteLine("check modbusTcp");
                // traitement ...
     
            }
        }
    J'ai besoin que l'application ne soit pas bloquée et que dans le cas où le traitement d'un thread ne soit pas terminé, le prochain attend.

    En l'état, si un thread est bloqué, les autres continuent à être démarrés toutes les 200ms.

    Peut-être dois je me tourner vers une autre classe ?

    Merci.

  2. #2
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 905
    Points : 1 923
    Points
    1 923
    Par défaut
    Est-ce-que tu peux donner un peu plus d'informations sur ce que tu cherches à faire ?

  3. #3
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut
    Bonsoir,
    Il s’agit d’une application industrielle. Je dois lancer à intervalle régulier (200ms) des requêtes tcp. L’application ne doit pas se figer, donc j’ai pensé utiliser System.Threading.Timer qui lance chaque «*tick*» dans un thread.
    Dans 99% des cas le traitement sera effectué avant la fin des 200ms cependant il suffit d’une lenteur sur le réseau de terrain ou un problème sur l’automate qui est en face pour dépasser ce temps.

    Je souhaite pouvoir être certain qu’une tâche est terminée (même si elle dépasse les 200ms) avant de lancer la tâche suivante.

  4. #4
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 905
    Points : 1 923
    Points
    1 923
    Par défaut
    Est-ce-que tu as besoin que la requête soit lancée pile toutes les 200ms (en prenant en compte le temps de traitement) ou c'est juste du monitoring et tu veux juste regarder "à peu près" toutes les 200ms ? Et puis il te faut une application console, une application fenêtrée ou un service ? Est-ce-qu'elle doit rester en fonctionnement en permanence ou juste une minute par exemple ?

    Sinon je peux te recommander un peu de lecture, à savoir la série de tutoriels de François Dorin sur l'utilisation du Pool de Threads. Le dernier chapitre concerne justement la mise en place d'une tâche périodique, mais tu peux commencer depuis le début pour appréhender l'ensemble des concepts.

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    en old school il y a le thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var th = new thread(read);
    th.isbackground = true;
    th.Start();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void read() 
    {
      while (true)
      {
         DoSomething();
         system.threading.thread.sleep(200);
      }
    }

  6. #6
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Est-ce-que tu as besoin que la requête soit lancée pile toutes les 200ms (en prenant en compte le temps de traitement) ou c'est juste du monitoring et tu veux juste regarder "à peu près" toutes les 200ms ? Et puis il te faut une application console, une application fenêtrée ou un service ? Est-ce-qu'elle doit rester en fonctionnement en permanence ou juste une minute par exemple ?

    Sinon je peux te recommander un peu de lecture, à savoir la série de tutoriels de François Dorin sur l'utilisation du Pool de Threads. Le dernier chapitre concerne justement la mise en place d'une tâche périodique, mais tu peux commencer depuis le début pour appréhender l'ensemble des concepts.
    Bonjour,

    Merci pour le lien, je vais regarder çà. Si j'ai quelques ms de différence, ce n'est pas un problème => je viens checker la zone mémoire d'un automate avec le protocole modbus tcp, je traite les infos et j'envoie une trame de données en tcp à un autre système industriel.

    Voici ce que j'ai fais résoudre ce problème :

    Au lieu de lancer un thread par "tick", je lance un timer dans un seul thread => je peux alors contrôler l'état du timer facilement.

    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
    32
    33
    34
    35
    36
    37
    38
    39
     
            static System.Timers.Timer timer;
     
            static void Main(string[] args)
            {
     
                timer = new System.Timers.Timer(200);
     
                Console.ReadLine();
                Thread t = new Thread(new ThreadStart(startTimer));
                t.Start();
                Console.ReadLine();
     
                timer.Enabled = false;
                t.Abort();
            }
     
            public static void startTimer()
            {
     
                Test mt = new Test();
     
                timer.Elapsed += mt.tick;
                timer.AutoReset = true;
                timer.Enabled = true;
     
            }
        }
     
        class Test
        {
            public void tick(Object source, ElapsedEventArgs e)
            {
                System.Timers.Timer t = (System.Timers.Timer)source;
                t.Enabled = false;
                Console.WriteLine("tick");
                t.Enabled = true;
            }
        }

Discussions similaires

  1. Attendre la fin d'un thread: Access violation
    Par Booster2ooo dans le forum Delphi
    Réponses: 5
    Dernier message: 15/04/2007, 10h31
  2. [thread]attendre la fin d'un thread?....
    Par babarpapa dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 29/03/2006, 14h31
  3. [Thread] Attendre la fin ...
    Par phplive dans le forum Langage
    Réponses: 2
    Dernier message: 21/03/2006, 22h29
  4. Attendre la fin des threads fils d'un processus
    Par SteelBox dans le forum Windows
    Réponses: 15
    Dernier message: 24/02/2006, 16h08
  5. [Thread] comment attendre la fin d'un thread?
    Par billynirvana dans le forum Concurrence et multi-thread
    Réponses: 11
    Dernier message: 24/08/2005, 10h43

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