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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    janvier 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2009
    Messages : 68
    Points : 38
    Points
    38
    Par défaut Lancement exécutable Delphi en ligne de commande
    Bonjour,

    Je souhaite lancer un traitement (exécutable Delphi) en ligne de commande sans intervention d'utilisateur, la forme ne comporte que des "TLabel" et est destinée seulement à afficher l'état d'avancement du traitement.

    Quand je mets le traitement dans l'évènement "OnShow", la forme est encore invisible.
    Quand je le mets dans l'évènement "OnActivate", la forme est visible mais le contenu des "TLabel.Caption" que je renseigne n'est pas encore visible.

    Je voudrais bien savoir dans quel évènement il faut que je mette mon traitement pour que les infos que je renseigne dans les "TLabel.Caption" de ma forme soient visibles.

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable informatique, développeur tout-terrain
    Inscrit en
    juin 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable informatique, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juin 2004
    Messages : 880
    Points : 4 290
    Points
    4 290
    Par défaut
    Citation Envoyé par momofr Voir le message
    Bonjour,

    Je souhaite lancer un traitement (exécutable Delphi) en ligne de commande sans intervention d'utilisateur, la forme ne comporte que des "TLabel" et est destinée seulement à afficher l'état d'avancement du traitement.

    Quand je mets le traitement dans l'évènement "OnShow", la forme est encore invisible.
    Quand je le mets dans l'évènement "OnActivate", la forme est visible mais le contenu des "TLabel.Caption" que je renseigne n'est pas encore visible.

    Je voudrais bien savoir dans quel évènement il faut que je mette mon traitement pour que les infos que je renseigne dans les "TLabel.Caption" de ma forme soient visibles.

    Merci d'avance pour votre aide.
    Alors déjà en lançant un traitement lourd dans un événement qui se produit lors de l'affichage en fait tu bloque temporairement l'affichage (le re-dessin), c'est donc une très mauvaise façon de faire

    Une solution élégante et efficace est de passer le traitement dans un thread qui serait instancié à l'affichage de la fiche (avec la classe TThread)

    La solution la plus simple est de lancer le traitement sur un TTimer qui se déclenche lors sur OnActivate de la fiche

    Mettre un TTimer sur ta fiche, choisir une valeur pour l'intervale (100 ms par exemple) et mettre à Enabled à False
    Dans le OnActivacte de la fiche :

    Timer1.Enabled:=True;

    Puis dans l’événement OnTimer celui ci :

    Timer1.Enabled:=False; (Pour ne pas lancer le traitement deux fois)
    Puis faire ton traitement ou appeler la procédure la procédure qui le fait

    Remarque qu'il faudra forcer le re-dessin de tes Tlabel avec des appels régulier à Application.ProcessMessages pour rafraichir l'affichage au cours du traitement car le traitement s'exécute quand même dans le thread principal de l'application et va donc bloquer le traitement des messages de rafraichissement des contrôles de ta fiche...

    Tu peux aussi envisager le recours aux taches (voir la classe TTask) c'est aussi un moyen plus élégant de faire

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    12 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 12 040
    Points : 21 158
    Points
    21 158
    Par défaut
    Autre technique, un PostMessage depuis le OnCreate ou OnActivate (lui aussi faire le mettre à nil pour éviter qu'il se reproduise), le Message sera traité lorsque la fenêtre le pourra, ça revient à un TTimer qui fonctionne aussi sur une base de message.
    Ensuite si le traitement est une boucle, tu peux le faire tourner directement alors que si le traitement est bloquant (genre une grosse requête SQL longue), voir la Parallélisation proposeé par sergio_is_back
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    janvier 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2009
    Messages : 68
    Points : 38
    Points
    38
    Par défaut
    Merci pour cette abondance de solutions.

    J'ai mis mon traitement dans une procédure spécifique.
    Cela fonctionne maintenant après avoir fait comme conseillé, c'est-à-dire après avoir ajouté :
    - un timer activé dans "FormActivate",
    - un "Application.ProcessMessages" après le chargement des "TLabel.Caption".

    Si j'ai bien compris, le timer est la solution la plus simple, mais il existe deux solutions plus élégantes mais moins simples :
    - un thread instancié à l'affichage de la fiche (avec la classe TThread),
    - le recours aux taches (classe TTask).
    Je ne connais pas encore et me documenterai à l'occasion.

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 817
    Points : 34 636
    Points
    34 636
    Billets dans le blog
    54
    Par défaut
    Bonjour
    Citation Envoyé par momofr Voir le message
    Si j'ai bien compris, le timer est la solution la plus simple, mais il existe deux solutions plus élégantes mais moins simples :
    - un thread instancié à l'affichage de la fiche (avec la classe TThread),
    - le recours aux taches (classe TTask).
    Je ne connais pas encore et me documenterai à l'occasion.
    Ne proscratinez pas, vous découvrirez un nouveau monde où vos fenêtres ne seront plus boquées par des traitements longs.
    je vous conseille le visionnage des vidéos de Olaf Monien "Delphi CE Bootcamp 2018 Week 7 - Threading and Performance Tuning" sur Embarcadero Academy très pédagogiques et faciles a comprendre
    malgré la barrière de la langue
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  6. #6
    Membre éprouvé
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2003
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : novembre 2003
    Messages : 933
    Points : 1 155
    Points
    1 155
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour

    Ne proscratinez pas, vous découvrirez un nouveau monde où vos fenêtres ne seront plus boquées par des traitements longs.
    je vous conseille le visionnage des vidéos de Olaf Monien "Delphi CE Bootcamp 2018 Week 7 - Threading and Performance Tuning" sur Embarcadero Academy très pédagogiques et faciles a comprendre
    malgré la barrière de la langue
    Je confirme d'autant plus que c'est aussi le meilleur moyen de vérifier que le traitement "long" n'est pas planté en affichant régulièrement une progression par exemple.
    Attention de bien mettre tous ce qui est affichage dans le thread principal en utilisant la méthode Synchronize

    Un petit exemple:
    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
     
    procedure TCalculLong.execute;
    var
      iprog:integer;
      Msg: string;
    begin
    for iprog:=0 to 10 do
     begin
       calcul;//routine de calcul qui prend du temps
       Synchronize(procedure
                  begin
                    Msg:=Format('Etape %d',[iprog]);
                    Form1.DisplayR.Lines.Add(Msg);
                  end);
     end;
     
    end;
    Cet exemple exécute un calcul long 10 fois et met dans un TMemo une ligne qui indique que le calcul a progressé
    Il y a des jours où j'éprouve une haine profonde envers microsoft
    Venez vous défouler ici ou c'est amusant
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    janvier 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2009
    Messages : 68
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    Il y a aussi la technique du PostMessage de ShaiLeTroll.

    Je vais finalement m'en tenir au Timer, simple à mettre en oeuvre et qui fonctionne parfaitement.
    On verra plus tard pour les autres techniques.

    Merci à tous

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

Discussions similaires

  1. Exécution Ant en ligne de commande
    Par kaboume dans le forum ANT
    Réponses: 7
    Dernier message: 22/03/2008, 12h24
  2. Lancement script Sql en ligne de commande
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 23/11/2006, 10h27
  3. Exécution programme en ligne de commande
    Par heddicmi dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 25/10/2006, 12h00
  4. [SQL-Server] exécution mssql_connect() en ligne de commande
    Par turinico dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/11/2005, 18h45

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