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 :

Question sur les priorités d'exécution de portions de code par rapport à d'autre?


Sujet :

Delphi

  1. #1
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut Question sur les priorités d'exécution de portions de code par rapport à d'autre?
    Bonjour.

    Voila je vous explique mon problème...

    J'ai un programme (vcl) qui me permet lors d'un clic sur un bouton d'exécuter une suite d'opération (pilotage d'un port série notamment...).Mais le problème c'est que j'ai un autre bouton qui me permet d'effectuer un arret d'urgence et je voudrais que l'événement de celui-ci soit prioritaire sur les autre. Aujourd'hui quand je clique sur ce bouton le logiciel continu le pilotage de la RS232 et ca peut etre dangereux dans certains cas .

    Dois je donc m'orienter vers la mise au moint de thread? La solution est t'elle d'utiliser le multithreading?
    je connais rien de cette méthode (ca me semble costaux ). dois créer un thread pour mon code associé au bouton d'arret d'urgence et un thread pour le reste de mon programme?

    Enfin aider moi car la je rame ... je ne comprend rien au multithreading

    merci d'avance
    Heureux est l'étudiant qui, comme la rivière, arrive à suivre son cours sans sortir de son lit........

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 854
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 854
    Points : 11 287
    Points
    11 287
    Billets dans le blog
    6
    Par défaut
    et si le bouton d'arrêt d'urgence envoyait un message qui serait traité par la procédure message idoine grâce à des ProcessMessages réguliers dans le code ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut

    et si le bouton d'arrêt d'urgence envoyait un message qui serait traité par la procédure message idoine grâce à des ProcessMessages réguliers dans le code ?
    Ola est en clair ?
    non alors la c'est du chinois pour moi les processMessage j'ai jamais utiliser ais explique moi peut etre que ca peut convenir si ca permet de gerer des interruption...
    Heureux est l'étudiant qui, comme la rivière, arrive à suivre son cours sans sortir de son lit........

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 854
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 854
    Points : 11 287
    Points
    11 287
    Billets dans le blog
    6
    Par défaut
    on peut définir des messages à partir de WM_USER selon une syntaxe que je n'ai pas sous la main...
    tu définis une procédure qui traitera le message
    tu rends la main à l'appli de temps en temps pour traiter les messages dans les traitements longs

    mais dans une même fiche, il suffit d'un booléen global :

    style :
    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
     
    const WM_MONMESSAGE = WM_USER+211;
    procedure (TForm1.)STOP(var Message: TMessageRecordType); message WM_MONMESSAGE;
    procedure TForm1.bnSTOPClick(Sender: TObject);
    begin
     ArretDemande:= True; // var globale
     SendMessage(self.Handle, WM_MONMESSAGE, ...); // inutile en fait,sauf entre applis
    end; 
    procedure longue;
    begin
     for i:=1 to MaxInt do begin
      if i=100*trunc(i/100) then Application.ProcessMessages; // rend la main pour les messages (dont STOP.Click)
      if ArretDemande then ...//
      ShowMessage(IntToStr(i));
     end;
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    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
    Peut être que cela suffit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure F.ButtonTraitementClick(...)
    begin
      while ( SuiteOperation = True ) and ( ButtonStop.Tag = 0 )  do
        begin
        // tes opérations sur rs232
        Application.ProcessMessages; // traitement des messages avant tours suivant
        end;
      ButtonStop.Tag := 0;
    end;
     
    procedure F.ButtonStop( ... )
    begin
      ButtonStop.Tag := 1;
    end;
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  6. #6
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    slt TicTacToe j'ai dejà le "Application.ProcessMessages;" mais ca suffit pas car les opérations sur la RS232 dure longtemps et en plus de cela je pilote des instrument de mesure (alimentations, osciloscope....) et lorsque je lance un test (puisqu'il s'agit d'un logiciel de test) cela peut duré longtemps et je dois pouvoir a tout moment activer mon bouton d'arret sans retard meme de 2 secondes... (sinon attention les dégats )...c'est pourquoi j'ai pensé au multithreading mais ca m'a l'air compliqué... (car dans le principe il me suffirait de créer un thread qui comprend les acces au appareils de mesure et à la RS232 laissant alors les autres fonctionalité du logiciel disponibles)
    Heureux est l'étudiant qui, comme la rivière, arrive à suivre son cours sans sortir de son lit........

  7. #7
    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
    je ne sais pas comment se passe tes traitements vers ou depuis le rs232, mais j'imagine que tu envoies une chaines ou plusieurs.
    Ton traitement en question, c'est un seul envoie d'une grosse chaine, ou plusieurs petits envois ?
    Il faut intercaler le ProcessMessage là ou il sera executé le + souvent (quitte à perdre un peu de temps...). C'est lui qui va déclencher la reprise de contrôle d'un click sur un bouton.
    Egalement le test du tag (juste après le ProcessMEssage idéalement), pour sortir de ta boucle instantanément (si utilisation de mon code).
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  8. #8
    Membre habitué Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Points : 174
    Points
    174
    Par défaut
    ben le problème c'est que de temps en temps je fais appel à des sleep et la quand je suis dans un sleep j'ai plus la main et donc pas d'appui sur le bouton d'arret d'urgence
    Heureux est l'étudiant qui, comme la rivière, arrive à suivre son cours sans sortir de son lit........

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/08/2014, 21h23
  2. Réponses: 7
    Dernier message: 27/05/2013, 12h33
  3. question sur les priorités des styles.
    Par Sniper37 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 14/06/2007, 17h16
  4. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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