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 ou sleep? Dur dur de choisir.


Sujet :

Delphi

  1. #1
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut Timer ou sleep? Dur dur de choisir.
    Bonjour,

    Je me retrouve confronté à un petit problème...

    En effet, j'ai une appli dans laquelle j'ai besoin de temporiser certaines actions.

    Pas de soucis, je suis parti sur la solution de la fonction sleep.

    Je teste, et là je m'apperçois que le sleep "endort" également les événements sur la form, ce qui se traduit pas une réaction très lente - par exemple si on désire déplacer l'interface ou même ma réduire - . Pas cool ça...

    Du coup, je me retourne vers un bon et vieux timer.

    J'implémente tout ça, je lance, et oh magie, plus de problèmes d'évènements liés à ma form. Bien bien bien me dis-je, mais c'était parler trop vite!

    En effet, travaillant sur un portable (très silencieux), voila que le ventilateur se met à tambouriner mes oreilles sensibles.

    Diantre, qu'est-ce ce phénomène me dis-je? Allons recherche le fautif processus qui consomme mes ressources CPU au point de briser la quiétude studieuse de mon environnement de travail!

    Un petit click-droit plus tard + un géstionnaire des tâches exécuté, et voila que j'observe que mon projet, en exécution, consomme dans les 80% de ressources processeur!!!

    Ayant eu des déboirs avec les timer sous LabWindows/CVI, je me dis: "tiens, comparons avec et sans timer".

    Et là, désillusions, le timer Delphi et aussi pourri que celui de CVI, il consomme des ressources le petit!

    Bon, trève de plaisenterie et de tournures verbales.

    Je me retrouve avec le problème suivant:
    - Utiliser un sleep qui consomme peu mais bloque la convivialité de mon soft
    - Utiliser un timer, plus confortable, sauf pour mon CPU et mes oreilles.

    La question du jour, donc, avons nous une solution permettant de bénéficier des deux avantages (et pas des deux inconvénients, je peux aussi faire un timer utilisant un sleep!!):
    - Pas de ralentissement et une consommation des ressources faible?

    Merci à tous.

  2. #2
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Salut,

    La fonction du Timer et de sleep n'est pas la même...

    Le Sleep, effectivement, temporise avant de passer à la suite (en passant, un refresh et un applications.ProcessMessages avant le sleep, ne sont souvent pas de trop pour ré-afficher correctement la form)

    Le Timer est là, pour lancer un action à un certain moment, ou pour vérifier qu'un certains délai s'est produit.
    Je ne pense pas que ce soit le timer qui consomme, mais plutot ce que tu lances dans le timer.

    D'ailleurs, à combien est-il réglé ? et est-ce que le code qui est lancé ne dépasse pas en temps de traitement le temps des intervals d'appel ?

  3. #3
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Bonjour,

    Ne pourrais-tu pas effectuer une temporisation à l'aide des threads?

    @+.

  4. #4
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    1) Effectivement, le timer et le sleep n'ont pas la même utilité, cependant, mon cas est l'exception à la règle: le but est de lancer à intervalle variable une action.

    Dans les deux cas, j'ai une boucle while qui appelle une fonction x fois.

    Dans le premier cas, j'ai inséré un application.processmessage avant un sleep de y millisecondes (y variant de 1000 à 10.000)

    Dans le second cas, j'ai encapsulé un autre while dans le premier. Juste avant de l'exécuter, je force la valeur d'un booléen. Ensuite, je défini le cycle de mon timer à y (y variant également de 1000 à 10.000), puis j'autorise le timer (propriété enable) à s'exécuter et enfin je rentre dans le structure while, composée uniquement d'un application.processmessage. L'événement du timer change uniquement la valeur de mon flag (le booléen), condition pour sortir de ma boucle d'attente.

    2) Utiliser un thread pour réaliser une telle opération!!! Cela signifierait qu'il n'existe pas de solution "basique" à ce problème... Et c'est pas mon style de sortir l'artillerie lourde pour résoudre un problème aussi simple.... En tout cas, j'espère trouver une solution alternative avant de me lancer là dedans!

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 675
    Points : 7 071
    Points
    7 071
    Par défaut
    Pour faire une pause, moi je fais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure Pause(const nDuree: Cardinal);
    var 
      Tc: Cardinal; 
    begin 
      Tc :=  GetTickCount; 
      repeat 
        Application.ProcessMessages; 
      until Cardinal(GetTickCount - Tc) > nDuree; 
    end;

  6. #6
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    peux-tu donner un exemple de tes 2 codes ?

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Bien vérifier que dans le traitement de l'event timer,
    il y a au début du traitement :
    ;
    et en fin de traitement :

  8. #8
    Dry
    Dry est déconnecté
    Membre du Club

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 48
    Points : 50
    Points
    50
    Par défaut
    Je complete la réponse de Lung, pour ne pas que ca pompe 100% du CPU pendant la pause

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure Pause(const nDuree: Cardinal);
    var
      Tc: Cardinal;
    begin
      Tc :=  GetTickCount;
      repeat
        Application.ProcessMessages;
        Sleep(1); //éventuellement Sleep(10) ou plus si tu n'est pas a 10 ms près...
      until Cardinal(GetTickCount - Tc) > nDuree;
    end;
    Bon dev !
    Dry

  9. #9
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Merci à Lung et Dry, votre solution me convient parfaitement, quoique un peu "batarde" à mon gout!!!

    Pour Graffito, j'avais oublié de suspendre la callback du timer

    Ceci dit, entre un test et une affectation de variable, je pense que j'étais loin des 1 sencondes, mais parfois, ça réagit bizarrement!!!

    Merci encore à tous d'avoir planché sur le sujet!!!

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

Discussions similaires

  1. référencement de mon site dur dur
    Par lionel20 dans le forum Flash
    Réponses: 10
    Dernier message: 14/06/2007, 14h23
  2. [MySQL] Requête imbriquée dur dur
    Par nebil dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 08/07/2006, 12h26
  3. Pthread et stdio dur dur
    Par greg13 dans le forum Linux
    Réponses: 3
    Dernier message: 21/03/2006, 22h56
  4. Dur dur Mandriva et Nvidia
    Par Cazaux-Moutou-Philippe dans le forum Mandriva / Mageia
    Réponses: 5
    Dernier message: 19/03/2006, 03h07
  5. [hard core] requête dur dur
    Par heid dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/02/2006, 11h39

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