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

Langage Delphi Discussion :

Question fine sur les timers


Sujet :

Langage Delphi

  1. #1
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut Question fine sur les timers
    RESOLU


    Bonjour,

    j'aimerais savoir pourquoi, si une boucle infinie placée dans une fonction d'un thread, bloque l'application si elle est lancée (une seule fois, lors du premier passage dans le timer) depuis un timer du thread, et non pas si elle est lancée (une seule fois aussi grâce à un booleen) depuis le Execute du même thread ?

    Sachant que le timer est mis à enabled=true dans le Execute.

    Etrange !

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    bloque l'application si elle est lancée (une seule fois, lors du premier passage dans le timer) depuis un timer du thread
    Oula... Il serait intéressant de voir le code derrière ce que tu appelles le "timer du thread"... D'où sors ce timer ? S'il s'agit d'un timer crée visuellement ou l'évènement OnTimer est implémenté dans le corps du thread, c'est tout à fait normal car ce dernier sera déclenché dans le contexte du thread principal et pas dans celui du second thread.

    De toutes façons, pourquoi utiliser un timer dans un thread ? D'une part cela ne fonctionnera pas à moins de rajouter une boucle de messages dedans (boulot superflu), et d'autres part tu peux très bien utiliser d'autres constructions du langage (TEvent / boucles whlie...)

  3. #3
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Reisubar Voir le message
    Oula... Il serait intéressant de voir le code derrière ce que tu appelles le "timer du thread"... D'où sors ce timer ? S'il s'agit d'un timer crée visuellement ou l'évènement OnTimer est implémenté dans le corps du thread, c'est tout à fait normal car ce dernier sera déclenché dans le contexte du thread principal et pas dans celui du second thread.

    De toutes façons, pourquoi utiliser un timer dans un thread ? D'une part cela ne fonctionnera pas à moins de rajouter une boucle de messages dedans (boulot superflu), et d'autres part tu peux très bien utiliser d'autres constructions du langage (TEvent / boucles whlie...)
    Non non, il s'agit d'un timer non visuel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
      TThread232 = class(TThread)
      private
     
        timerThread232:TTimer;
        procedure procTimer(sender:Tobject);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    constructor TThread232.create(suspend : Boolean);
    begin
      inherited Create(suspend);
      timerThread232:=TTimer.create(nil);
      timerThread232.OnTimer:=procTimer;
      timerThread232.Interval:=dureeIntervalTimer232;
      timerThread232.Enabled:=false;
    end;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TThread232.Execute;
    begin
     
      while not self.Terminated do
      begin
        if firstExecute = true then
        begin
          firstExecute:=false;
          timerThread232.Enabled:=true;
        end;
      end;
     
    end;

  4. #4
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    De plus ton thread est executé en boucle sans pause (sleep). Je pense que c'est ça qui fait que l'appli se fige.

    Le timer et le thread sont un peu redonnant ...
    A la limite tu as juste besoin de mettre dans le Execute sans rien d'autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure Execute;
    begin
     timerThread232.Enabled:=true;
    end;
    Mais je pense que la meilleure solution est d'enlever le Timer, et de tout gérer dans le thread.

  5. #5
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    TTimer fait partie de la VCL... je ne suis pas bien sûr qu'il soit "thread safe" (c'est comme ça qu'on dit ? ), en d'autres termes on ne peut sans doute pas l'utiliser dans un thread.

  6. #6
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Linkin Voir le message
    De plus ton thread est executé en boucle sans pause (sleep). Je pense que c'est ça qui fait que l'appli se fige.

    Le timer et le thread sont un peu redonnant ...
    A la limite tu as juste besoin de mettre dans le Execute sans rien d'autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure Execute;
    begin
     timerThread232.Enabled:=true;
    end;
    Mais je pense que la meilleure solution est d'enlever le Timer, et de tout gérer dans le thread.

    Comment se comporte l'éxecute dans ce cas là ? Il est exécuté en boucle, ou bien une seule fois lors du create du thread (vu que suspend = false) ?

    Le "while not terminated" donné partout en exemple me faisait penser que le execute du thread était parcouru en boucle, non ?

    ==> je viens de vérifier, le execute est passé en boucle.
    ====> Erreur stupide, la boucle vient du While not terminated...

  7. #7
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par CapJack Voir le message
    TTimer fait partie de la VCL... je ne suis pas bien sûr qu'il soit "thread safe" (c'est comme ça qu'on dit ? ), en d'autres termes on ne peut sans doute pas l'utiliser dans un thread.
    Ben si, le timer fonctionne bien (dans son utilisation normale, je l'ai un peu détourné temporairement pour faire les tests sur la boucle infinie intra-thread).

    Il permet au thread d'aller voir toutes les x millisecondes si certains booleens sont à vrai afin de vérifier l'état de certaines choses...).

    Ne pas utiliser le timer, je sais faire, je l'ai déjà codé, mais c'est moins simple : j'avais géré les laps de temps de passage dans le execute avec des variables de type TDateTime, et les fonctions de comparaisons de milliseconde (voir la batterie des fonctions millisecondsBetween...).

    Tu penses qu'il est préférable d'utiliser la seconde méthode citée plutôt qu'un timer ? (à l'intérieur d'un thread s'entend).

  8. #8
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    Tout dépend de la précision que tu veux et du temps de traitement.

    Pour ma part, ces critères ne m'importent pas dans mes cas d'utilisation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure Execute;
    begin
      while not Self.Terminated do
      begin
        // Ton code
     
        // Attente
        Sleep(2000);
      end;
    end;

  9. #9
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Linkin Voir le message
    Tout dépend de la précision que tu veux et du temps de traitement.

    Pour ma part, ces critères ne m'importent pas dans mes cas d'utilisation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure Execute;
    begin
      while not Self.Terminated do
      begin
        // Ton code
     
        // Attente
        Sleep(2000);
      end;
    end;
    Je me suis entre temps joint à toi, j'ai laissé tombé le timer (son côté VCL-like ou bien encore "not thread-safe" doit être de mauvaise augure dans un thread ).

    Je gère comme je l'avais fait auparavant, via des constantes indiquant des delai en millisecondes suivant divers traitements pouvant être à mener à terme ou à vérifier (selon les cas), le tout géré dans le execute via les TDate functions...

    Ca marche bien.

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

Discussions similaires

  1. [CS5] Question sur les timers
    Par Ashraam dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 16/11/2011, 08h17
  2. [VB.net] Question simple sur les Timers
    Par ShortcutZ dans le forum Windows Forms
    Réponses: 12
    Dernier message: 22/09/2009, 11h06
  3. question générale sur les conteneurs
    Par tut dans le forum C++
    Réponses: 6
    Dernier message: 01/09/2004, 10h11
  4. Question générale sur les affectations ?
    Par Clemaster dans le forum C++
    Réponses: 5
    Dernier message: 09/08/2004, 17h03
  5. Question simple sur les threads :)
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/06/2003, 04h13

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