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 :

Temporisation d'action, Threads


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut Temporisation d'action, Threads
    Bonjour a tous,

    Je développe actuellement un petit prog qui doit déclencher des actions temporisées par rapport a l'évènement déclencheur, mais en plus de cela, il peut y avoir plusieurs évènements lancés avant la fin de chaque temporisation.

    J'aimerais avoir un traitement de ce genre :
    -Event1 ---------------------------> Action1
    ---------- Event2 ---------------------------> Action2
    -------------------- Event3 ---------------------------> Action3
    --------------------- Event4 ---------------------------> Action4

    J'ai donc pensé a travailler avec des Threads (nouveaux pour moi).

    Le probleme, c'est qu'avec des évenements séparés (apres la fin d'une autre temporisation), ca marche, par contre, si les temporisations se chevauchent (schéma), c'est lent, ça n'execute qu'une action sur 2, et c'est assez aléatoire.

    Avez vous une idée de solution ?

    Mon implémentation :
    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
     
    TThrowKey=class(TThread)
        private
          lvKey:integer;
          lSpeed:real;
          lWndH:THandle;
        public
          constructor Create(vKey:integer; Speed:real; WndH:THandle);
          procedure Execute();override;
      end;
     
    {...}
     
    constructor TThrowKey.Create(vKey: Integer; Speed: Real; WndH:THandle);
    begin
     
      inherited Create(true);
      FreeOnTerminate:=true;
      Priority:=tpNormal;
     
      lvKey:=vKey;
      lSpeed:=Speed;
      lWndH:=WndH;
    end;
     
    procedure TThrowKey.Execute();
    begin
      Sleep(round((1000/Speed)-(1000*(68/(240*Speed)))));
      SendMessage(lWndH, 256, lvKey, 0);
      SendMessage(lWndH, 257, lvKey, 0);
      windows.beep(4000, 100);
    end;

    Et les évènements déclencheurs (Ils sont dans une procédure appelée par un timer, interval 10 pour le moment pour tester) :
    (J'aimerais me passer du timer qui est lent et lourd mais je ne sais pas par quoi le remplacer).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if CheckArrow(ALeft) then
      begin
        newThread:=TThrowKey.Create(VK_LEFT, Speed, WndH);
        newThread.Execute();
      end;
     
      if CheckArrow(ARight) then
      begin
        newThread:=TThrowKey.Create(VK_RIGHT, Speed, WndH);
        newThread.Execute();
      end;
     
    {Et de meme avec Down et Up...}
    Merci d'avance.
    Cordialement.

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    Sur un système windows ton programme n'as pas la maitrise du temps. C'est le système d'exploitation qui l'a.
    Pour que ton programme marche bien il faut que celui-ci soit léger (Peu de boucles répétitives). Eventuellement lors de la réception de l'évenement tu relèves l'heure. Quand tu mets 10 dans ton timer tu fixes un objectif au système d'exploitation que celui-ci de toute façon ne respectera pas.
    Utilises une pile fifo pour stocker les évènements reçus et un thread pour traiter les actions en retour. Le sleep dans ton thread ne sert à rien.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 93
    Points : 44
    Points
    44
    Par défaut
    Merci de ta réponse !

    D'accord la lourdeur du programme, je vois bien le probleme.

    Par contre, pour ce qui est de ta solution, j'avoue avoir du mal a comprendre :
    Je ne vois pas comment je pourrais executer des actions dont les temporisations se chevauchent en utilisant une lilo et un thread pour les executer.

    De plus, pour le relevé de l'heure, le probleme est que ma temporisation est de l'ordre des centaines de millisecondes (entre 500ms et 1sec en gros).

    Si quelqu'un a une autre idée, ...

    Merci d'avance.

  4. #4
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Bjr

    ça n'execute qu'une action sur 2
    Comment ça ? Si chaque action est dans un thread elle s'exécute forcément à un moment ou à un autre (peut être pas dans l'ordre que tu souhaites mais ça c'est autre chose)
    A mon avis si tu "rates" des actions c'est vraisemblablement parce que ton timer manque tes fameux événements et donc ne génère pas l'action.

    Dans ton Timer tu fais un checkarrow pour déclencher tes évènements ? Pourquoi faire ? Si tu cherches juste à savoir si les touches sont enfoncées utilise les messages windows.
    Ensuite comme l'a dit ALWEBER stocke tes événements en attente dans une pile FIFO directement dans le prog principal.
    Dans ton Timer tu te contentes alors de lire le contenu de ton FIFO (c'est juste une liste en fait hein c'est rien de bien sorcier) et tu créés autant de thead qu'il y a d'éléments dans la pile.

Discussions similaires

  1. Temporiser une action en évènementiel
    Par Kikouyou1080 dans le forum VB.NET
    Réponses: 6
    Dernier message: 30/04/2010, 23h23
  2. pb: erreur inconnue! (thread? command action?)Bluetooth
    Par corseb-delete dans le forum Java ME
    Réponses: 1
    Dernier message: 12/03/2007, 12h57
  3. [Réseau][Thread]2 actions en même temps
    Par Belegkarnil dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 18/12/2005, 09h45
  4. [Threads] Actions continues avec des threads
    Par MiJack dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 10/10/2005, 17h32
  5. [Struts]2 Threads identiques quand j'appelle une action
    Par seb55555 dans le forum Struts 1
    Réponses: 4
    Dernier message: 03/05/2005, 16h49

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