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 :

Procédure attendant un message


Sujet :

Delphi

  1. #1
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut Procédure attendant un message
    Bonjour,

    Voici ce que je dois développer, sachant qu'aujourd'hui je n'ai aucun résultat concluant.

    J'ai une procédure qui fait un calcul puis attend la réception d'un signal sur le port USB. Dans la pratique ça se traduit de la façon suivante :

    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
     
    var
      valeurAttendue :integer;
     
    procedure MaMethode;
    begin
    valeurAttendue := -1;
     
    // Calcul
    // ...
     
    while valeurAttendue < 0 do
    begin
    // ...
      Sleep(1);
    end;
     
    if valeurAttendue > 0 then
    begin
    // C'est bon je peux traiter ma valeur
    end;
    end;
     
    procedure OnDeviceData(data : integer);
    begin
     valeurAttendue  := data;
    end;
     
    end;
    J'ai essayé de simplifier au maximum. Ces lignes de code sont dans une dll, et le soucis c'est que malgrés le Sleep(1), j'ai l'impression que l'évènement ne se déclenche jamais et l'appli ne répond plus...

    L'ajout d'un "Application.ProcessMessage" ne résoud pas le problème, peut être parce que ce code est dans une dll chargée dynamiquement...

    Si quelqu'un a une idée je suis preneur. En attendant je vais tenter d'appeler la première méthode dans un thread séparé.

  2. #2
    Membre régulier
    Profil pro
    Directeur
    Inscrit en
    Juin 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Juin 2005
    Messages : 113
    Points : 87
    Points
    87
    Par défaut
    Salut
    je m'y connais très peu en delphi et encore moins en dll mais je pense que personne ne pourra t'aider avec un morceau de code si petit.
    Qui plus est, tes variables ... valeurAttendu et valeurAttendue, c'est la meme ou non?
    Enfin, n'y a-t-il pas moyen de la debugger histoire de voir d'ou vient le problème ? (ou mettre des ShowMessage() pour vour ou ca plante)

  3. #3
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    Bonjour,

    J'ai corrigé le nom de la variable. Dans mon cas ma question est plus lié un problème de conception avant d'être un problème de code. D'ailleurs le code épuré est juste là pour schématisé mon explication écrite en "français"...

  4. #4
    Membre régulier Avatar de user 56gt8
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 92
    Points
    92
    Par défaut
    Bonsoir, le context globale de la question me fait penser à ca:
    Si ta procedure attend un message (disons une variable), implemente plutôt une propriété dans la classe , puisque les propriétés permettent de déclancher un morceau de code quand elles changent.

    Ca sera plus simple que de tester la variable dans la procédure.
    Dans ton exemple la propriété serait 'valeur attendue'.Quand elle changera , ton code s'éxecutera automatiquement.

    Pour le moment ta boucle while--sleep c'est pas étonant qu'elle sature ton programme.Mettre 'valeur attendue' en propriété réglerait ce problème.

    Voilà une piste ,je pense.

  5. #5
    Membre actif Avatar de liazidf
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Mai 2002
    Messages : 281
    Points : 261
    Points
    261
    Par défaut
    Citation Envoyé par declencher Voir le message
    Bonjour,

    J'ai corrigé le nom de la variable. Dans mon cas ma question est plus lié un problème de conception avant d'être un problème de code. D'ailleurs le code épuré est juste là pour schématisé mon explication écrite en "français"...
    bonsoir,
    ne serait-il pas plus interessant d'utiliser un thread avec condition de sortie, la valeur attendue?
    j'ai déjà vu post à ce sujet.

  6. #6
    Membre régulier Avatar de user 56gt8
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 86
    Points : 92
    Points
    92
    Par défaut
    En fait , je retire ce que j'ai dit , le problème c'est que dans ta procédure tu initilialise 'ma valeur attendue' à -1.Du coup ton ondevicedata sert à que dalle.ca serait plus juste de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure OnDeviceData(data : integer);
    begin
     MaMethode(data)
    end;
     
    procedure MaMethode('va');
    begin
     // Calcul (sur 'va' et resultat sur 'va' au final)
     // ...
    if 'va' < 0 then Exit
    // Autrement C'est bon je peux traiter ma valeur
    end;
    Parce que sinon ca ne sert à rien de mettre valeurattendue := data si à chaque fois que 'MaMethode' commence tu remets la valeur à -1.Ou alors tu as fais une erreur dans la description.

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 424
    Points : 5 829
    Points
    5 829
    Par défaut
    Citation Envoyé par declencher Voir le message
    Bonjour,

    ...
    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
     
    var
      valeurAttendue :integer;
     
    procedure MaMethode;
    begin
    valeurAttendue := -1;
     
    // Calcul
    // ...
     
    while valeurAttendue < 0 do
    begin
    // ...
      Sleep(1);
    end;
     
    if valeurAttendue > 0 then
    begin
    // C'est bon je peux traiter ma valeur
    end;
    end;
     
    procedure OnDeviceData(data : integer);
    begin
     valeurAttendue  := data;
    end;
     
    end;
    ...
    à quelle moment valeurAttendue est modifié ?

    de plus évite le sleep et utilise plutôt
    application.processmessages ce qui permet a l'application de gérer sa queue de messages

    et enfin dans des cas pareille je préfère utiliser les message c'est bien plus pratique

    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
     
    procedure Tfrm.Initialise;
    begin
       // Calcul
       // ...
    end;
    procedure Tfrm.MaMethode(valeurAttendue : integer);
    begin
      if valeurAttendue > 0 then 
      begin
          // C'est bon je peux traiter ma valeur 
      end;
    end;
     
    procedure Tfrm.OnDeviceData(data : integer);
    begin
       MaMethode(data);
    end;
    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

Discussions similaires

  1. [XL-2010] Procédure bloquée sans message d'erreur
    Par tarmok13 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 15/04/2019, 09h49
  2. Thread attendant les messages d'autres Thread
    Par Christophe_ dans le forum Général Java
    Réponses: 3
    Dernier message: 09/12/2009, 12h05
  3. Message d'erreur avec la procédure InStr
    Par Subkill dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 22/03/2007, 19h36
  4. Réponses: 7
    Dernier message: 26/09/2006, 09h38
  5. Message durant execution procédure
    Par chapodpaille dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 16/03/2006, 17h49

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