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

 Delphi Discussion :

Timer en application console


Sujet :

Delphi

  1. #1
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut Timer en application console
    Bonjour,

    je souhaite utiliser les timer dans une application console. J'ai lu qu'il fallait utiliser SetTimer et KillTimer.
    On ne peut vraiment pas utiliser le composant TTimer ?
    Cela m'étonne car si je n'affecte pas de parent à timer dans une application fenêtre, ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        Timer2 := TTimer.Create(nil) ;
        Timer2.Interval := 1000 ;
        Timer2.OnTimer := Timer.TimerEnd ;
        Timer2.Enabled := true ;

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Par défaut
    Bonjour,

    Est ce vraiment une application console ?

    Où est ce simplement une application "cachée" ?


    A+

  3. #3
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Je ne vois pas ce qui pourrais t'empêcher d'utiliser un TTimer comme tu le proposes, en le créant avec nil en proprio.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  4. #4
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    C'est bien une application console et moi non plus je ne vois pas ce qui empêche d'utiliser TTimer pourtant ça ne fonctionne pas. Etrange.

  5. #5
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Citation Envoyé par bubulemaster Voir le message
    C'est bien une application console et moi non plus je ne vois pas ce qui empêche d'utiliser TTimer pourtant ça ne fonctionne pas. Etrange.
    Peux-tu montrer un peu le code de contexte, qu'on puisse trouver ce qui ne va pas
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    J'ai une classe contenant le timer :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    unit MaxExecutiontimer;
     
    interface
     
    uses
      Classes, Functions, ExtCtrls, UnitMessages ;
     
    type
      TMaxExecutiontimer = class
      private
        { Déclarations privées }
        Timer : TTimer ;
      protected
        { Déclarations protégées }
      public
        { Déclarations publiques }
        procedure TimerEnd(Sender: TObject);    
        procedure Enable(state : Boolean) ;
        constructor Create(TimeOfTheTime : Integer) ;
        destructor Free ;    
      published
        { Déclarations publiées }
      end;
     
    implementation
     
    {*******************************************************************************
     * Fonction appelée lorsque le timer est écoulé
     ******************************************************************************}
    procedure TMaxExecutiontimer.TimerEnd(Sender: TObject);
    begin
        Timer.Enabled := False ;
        ErrorMsg(sTimeIsEnd) ;
        FinishProgramm ;
        Halt ;
    end ;
     
    {******************************************************************************
     * Consructeur
     ******************************************************************************}
    constructor TMaxExecutiontimer.Create(TimeOfTheTime : Integer) ;
    begin
        inherited Create();
     
        Timer := TTimer.Create(nil) ;
        Timer.Interval := TimeOfTheTime ;
        Timer.OnTimer := TimerEnd ;
        Timer.Enabled := False ;
    end ;
     
    {******************************************************************************
     * Destructeur
     ******************************************************************************}
    destructor TMaxExecutiontimer.Free ;
    begin
        Timer.Free ;
    end ;
     
    procedure TMaxExecutiontimer.Enable(state : Boolean) ;
    begin
        Timer.Enabled := State
     end ;
     
    end.
    et le code dans l'application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaxExecutiontimerVar := TMaxExecutiontimer.Create(ElapseTime * 1000) ;
    MaxExecutiontimerVar.Enable(ElapseTime > 0) ;
    Je viens de modifier la classe pour utiliser SetTimer et KillTimer mais ça ne fonctionne pas :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    unit MaxExecutiontimer;
     
    interface
     
    uses
      Classes, Functions, ExtCtrls, UnitMessages, UnitOS, Windows, SysUtils ;
     
    type
      TMaxExecutiontimer = class
      private
        { Déclarations privées }
        //Timer : TTimer ;
        Intervale : Cardinal ;
        Timer : Cardinal ;
      protected
        { Déclarations protégées }
      public
        { Déclarations publiques }
        procedure TimerEnd ;    
        procedure Enable(state : Boolean) ;
        constructor Create(TimeOfTheTime : Cardinal) ;
        destructor Free ;    
      published
        { Déclarations publiées }
      end;
     
      procedure TimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; dwTime: DWORD); stdcall;
     
    implementation
     
    Const NumTimer = 1 ;
     
    {*******************************************************************************
     * Fonction appelée lorsque le timer est écoulé
     ******************************************************************************}
    procedure TMaxExecutiontimer.TimerEnd ;
    begin
        OsKillTimer(timer) ;
        //Timer.Enabled := False ;
        ErrorMsg(sTimeIsEnd) ;
        FinishProgramm ;
        Halt ;
    end ;
     
    procedure TimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; dwTime: DWORD); stdcall;
    begin
        KillTimer(NumTimer) ;
        writeln('erotyeoryot') ;
    end;
     
    {******************************************************************************
     * Consructeur
     ******************************************************************************}
    constructor TMaxExecutiontimer.Create(TimeOfTheTime : Cardinal) ;
    begin
        inherited Create();
        Intervale := TimeOfTheTime ;
        Timer := NumTimer ;
        {
        Timer := TTimer.Create(nil) ;
        Timer.Interval := TimeOfTheTime ;
        Timer.OnTimer := TimerEnd ;
        Timer.Enabled := False ;
        }
    end ;
     
    {******************************************************************************
     * Destructeur
     ******************************************************************************}
    destructor TMaxExecutiontimer.Free ;
    begin
        //Timer.Free ;
        KillTimer(timer)
    end ;
     
    procedure TMaxExecutiontimer.Enable(state : Boolean) ;
    begin
        //Timer.Enabled := State
        if state = true
        then
            SetTimer(0, timer, Intervale, @TimerProc) //TimerEnd)
        else
            KillTimer(0, timer) ;
    end ;
     
    end.
    A prioris il faut absolument un Handle.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2003
    Messages : 115
    Par défaut
    Salut

    La gestion des timer est basée sur des messages que windows va envoyer à un handle (le WM_TIMER en l'occurrence).
    Dans une application console, tu n'as pas de fenêtre, ni de TApplication, donc pas de handle, et pas de pompe à message (c'est la boucle infinie qui traite les messages en attente du handle, et donc le WM_TIMER)

    Tu peux utiliser le TApplication : tu fais application.initialize, ensuite tu lances application.run pour amorcer la pompe. Elle se terminera avec un application.terminate.

  8. #8
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Ah oui, c'était ça qui manquait : le traitement des messages WM_TIMER

    Alors il vaut peut-être mieux utiliser un thread qui va uniquement faire Sleep(Interval); TimerEnd;

    Au fait, le destructeur ne s'appelle pas Free ! C'est Destroy, et il se déclare comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    destructor Destroy; override;
     
    destructor TMaClasse.Destroy;
    begin
      ...
      inherited;
    end;
    Et il ne faut surtout pas oublier le inherited.

    En revanche, on utilise bien Free pour demander la destruction d'un objet. Free appelle Destroy, pour autant que celui-ci soit bien override.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

Discussions similaires

  1. Utiliser un timer dans une application console
    Par chavers dans le forum Langage
    Réponses: 8
    Dernier message: 25/05/2005, 14h07
  2. [Kylix] une application console
    Par naili dans le forum EDI
    Réponses: 3
    Dernier message: 19/04/2004, 14h27
  3. [Delphi] Application "console" et caractères ASCII
    Par Yorys dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 31/07/2003, 09h50
  4. [Kylix] Kylix 3 et Applications console
    Par deniscm dans le forum EDI
    Réponses: 2
    Dernier message: 14/01/2003, 13h37
  5. [Kylix] application console avec kylix 3 ?
    Par Hakim dans le forum EDI
    Réponses: 4
    Dernier message: 15/11/2002, 22h45

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