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

Lazarus Pascal Discussion :

TAsyncProcess sous Linux : quelqu'un connaît ?


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut TAsyncProcess sous Linux : quelqu'un connaît ?
    Bonsoir,

    l'aide étant lamentable sur ce coup-là, j'ai un peu googlé (y a pas grand chose) et suis tombé sur un site allemand (pas d'bol je connais pas ce langage ) où j'ai découvert ça, prévu pour Windows :
    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
    var
      AProcess: TAsyncProcess;
     
    procedure TForm1.Term(Sender: TObject);
    begin
      ShowMessage('End');
      FreeAndNil(Sender);
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      AProcess := TAsyncProcess.Create(nil);
      try
        AProcess.Executable := 'calc.exe';
        //AProcess.Options := AProcess.Options + [poNoConsole];
        AProcess.OnTerminate:= @term;
        AProcess.Execute;
      finally
        //
      end;
    end;
    Le dernier post se terminant par "Danke", j'en ai conclu que ça pourrait le faire mais non, car après avoir changé la ligne de l'exécutable par AProcess.Executable := '/bin/df'; // ou 'ls', je ne vois jamais le ShowMessage

    Une idée ?
    Merci par avance,

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut
    Bonjour Jipété !

    Je n'ai pas la solution à ton problème. En revanche, je te confirme que le code fonctionne correctement sous Windows.

    Il y a quand même une chose qui m'intrigue dans ton message : df et ls, ce sont des commandes, non ? Est-ce que ça fonctionne ? Je demande ça parce que, sous Windows, ça ne fonctionnerait pas : il faut un exécutable (mais probablement le sais-tu déjà).

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Salut Roland,

    et merci de ton test.

    Sous Linux ce que tu appelles une commande c'est un fichier exécutable : il y en a tout plein dans /bin, et ça peut être un script (bash, perl, etc.) ou un binaire venant d'un code en C compilé.

    J'ai essayé (toujours sous Linux) la manip suivante : dans Laz, Projet / Nouveau / Application, et j'ai simplement posé depuis l'IDE (onglet System) un objet TAsyncProcess, à qui j'ai assigné l'événement OnTerminate, et j'ai testé 2 binaires, définis (l'un après l'autre ) dans la propriété Executable.
    L'un est une commande, en console donc (le fameux df [pour Roland : c'est un outil qui te donne l'espace libre/occupé/total de tous les disques de la machine]), et l'autre est un programme avec ihm développé en Laz, et que j'exécute habituellement en double-cliquant dessus, ou lancé à l'aide de TProcess (dans un autre outil).
    On peut difficilement faire plus court :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.asyncpTerminate(Sender: TObject);
    begin
      ShowMessage('end');
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      asyncp.Execute;
    end;
    Résultats : l'ihm est visible dans le second cas, mais jamais de ShowMessage au OnTerminate.

    Quelqu'un a un jour (octobre 2008 !) signalé ce bug (j'aurais peut-être dû commencer par chercher ), mais la correction a des effets de bord ; bon, je vais tester tout ça...

    [EDIT] Suis allé voir le fichier gtkdefines.inc signalé dans le fil indiqué ci-dessus, ben... le canard est toujours vivant !
    Voici le début du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // TODO: Test on all platforms
    {$IFNDEF DisableAsyncProcess}
      {$IFDEF Linux}
        {$IFDEF CPUI386}
          {off $DEFINE UseAsyncProcess}
        {$ENDIF}
      {$ENDIF}
    {$ENDIF}
    J'adôôôôôôôre le TODO, ou , au choix, ou les deux ! [/EDIT]


    Et je ne veux pas utiliser TProcess, qui est bloquant : je travaillais à son encapsulation dans un thread quand j'ai découvert TAsyncProcess, qui semblait répondre à mes besoins, sauf que c'est la misère, comme on peut le voir...

  4. #4
    Membre expérimenté
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 161
    Par défaut
    salut Jipété,
    le bug est connu mais pas résolu !!! La correction a l'air d'être toujours reportée à la version suivante voir ici :
    bug 17807

    Amicalement, nullosse

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    Billets dans le blog
    9
    Par défaut
    Merci pour tes explications, Jipété.

    Citation Envoyé par Jipété Voir le message
    Et je ne veux pas utiliser TProcess, qui est bloquant
    Mais alors, à quoi correspond l'option poWaitOnExit ?

    Autrement, ne pourrais-tu pas utiliser l'astuce indiquée dans cette discussion ?

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Citation Envoyé par Nullosse Voir le message
    salut Jipété,
    le bug est connu mais pas résolu !!! La correction a l'air d'être toujours reportée à la version suivante voir ici :
    bug 17807

    Amicalement, nullosse
    Oui, ça a l'air d'être le même que celui que j'ai signalé.

    Citation Envoyé par Roland Chastain Voir le message
    Merci pour tes explications, Jipété.

    Mais alors, à quoi correspond l'option poWaitOnExit ?

    Autrement, ne pourrais-tu pas utiliser l'astuce indiquée dans cette discussion ?
    Je ne sais pas. Et la discussion ne semble pas correspondre à ce qui m'intéresse.

    Par contre, c'est le gtk2/gtk2defines.inc qu'il faut modifier, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          {.off $DEFINE UseAsyncProcess}
          {$DEFINE UseAsyncProcess}
    J'ai recréé mon IDE (Outils / Créer Lazarus avec le profil: normal) et ça le fait ! J'ai enfin mon ShowMessage
    Est-ce que je peux cliquer alors que je n'ai pas testé l'effet de bord indiqué dans le fil (pb avec gdb) ?

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Est-ce que je peux cliquer alors que je n'ai pas testé l'effet de bord indiqué dans le fil (pb avec gdb) ?
    Ouais ben l'effet de bord il pue !

    D'une part à la compilation d'un projet la fenêtre de messages m'affiche parfois xx hints issued mais sans m'indiquer qui quoi où...

    Et par ailleurs à la fermeture de l'IDE le form-designer reste présent à l'écran et l'usage cpu grimpe à fond
    ps ax (pour Roland, = au gestionnaire de tâches) me montre bien que le process lazarus reste en mémoire...
    Obligé de le killer à la mano !

    C'est pas gagné cette affaire...

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Salut à tous,
    Citation Envoyé par Roland Chastain Voir le message
    (...) Mais alors, à quoi correspond l'option poWaitOnExit ? (...)
    Suite à mes mésaventures, j'ai creusé un peu cette histoire d'option poWaitOnExit du TProcess, et ma foi, en utilisant un TTimer (Wait4EndProcess), ça a l'air d'aller :
    je pose un TProcess sur la form, je définis l'Executable qu'il va appeler, je définis les Parameters qu'il va lui passer, je définis les Options (poWaitOnExit à False),
    je rajoute 2 boutons et ce fameux timer (Enabled à False) dont l'Interval est réglé à 100, et hop !

    J'ai entre autres joué avec ping -c9 localhost, et le bouton Stopper est parfaitement actif, et merci Roland.

    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
    procedure TForm1.btnLancerClick(Sender: TObject);
    begin
      aProcess.Execute;
      Wait4EndProcess.Enabled := True;
    end;
     
    procedure TForm1.btnStopperClick(Sender: TObject);
    begin
      if aProcess.Running then FpKill(aProcess.processID, SIGINT); // /!\ uses BaseUnix /!\
    end;
     
    procedure TForm1.Wait4EndProcessTimer(Sender: TObject);
    begin
      While aProcess.Running do
      begin
        Edit1.Text:=TimeToStr(Now); // contrôle
        Exit;
      end;
      Wait4EndProcess.Enabled := False;
      ShowMessage('fin');  // contrôle
      // récup des données du process, etc.
    end;
    ---
    Deux trucs curieux, cependant, qui n'ont rien à voir avec ce qui précède, mais beaucoup plus aux effets de bord dont je parlais hier (peut-être lié à mes manips foireuses) :
    je me suis rendu compte que modifier des options (nom de l'exécutable appelé par exemple) dans l'inspecteur d'objets n'était pas pris en compte : il me faut absolument enregistrer pour que ça roule , je n'avais jamais remarqué ça avant...
    Et aussi, lorsque je compile, je n'ai plus les messages à propos des unités non utilisées, alors que dans les options de l'ide c'est prévu

    Ça rend la réinstallation, tout ça...

Discussions similaires

  1. [Série] Accès au port série sous linux
    Par ghost dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 10/10/2007, 10h43
  2. Comment désinstaller MySQL sous linux
    Par nahmsath dans le forum Installation
    Réponses: 5
    Dernier message: 18/09/2007, 10h46
  3. installer jbuilder7 sous linux
    Par rtlinfo34 dans le forum JBuilder
    Réponses: 5
    Dernier message: 30/10/2002, 19h16
  4. Réponses: 2
    Dernier message: 25/10/2002, 22h19
  5. Je ne peux établir une connexion cliente sous Linux.
    Par Anonymous dans le forum CORBA
    Réponses: 5
    Dernier message: 16/04/2002, 15h57

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