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

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 918
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 918
    Points : 15 353
    Points
    15 353
    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 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 492
    Points
    15 492
    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 éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 918
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 918
    Points : 15 353
    Points
    15 353
    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 averti
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 156
    Points : 331
    Points
    331
    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 085
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 492
    Points
    15 492
    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 éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 918
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 918
    Points : 15 353
    Points
    15 353
    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 éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 918
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 918
    Points : 15 353
    Points
    15 353
    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 éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 918
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 918
    Points : 15 353
    Points
    15 353
    Par défaut
    Citation Envoyé par Jipété Voir le message
    (...) C'est pas gagné cette affaire...
    Et c'est même la cata

    Ce soir, j'ai juste remis dans l'état d'origine (une ligne et un point à virer, voir deux posts avant) et depuis, impossible de recréer l'IDE, et impossible de faire tourner le moindre programme, même un truc tout simple avec juste une Form avec rien dessus : ça compile mais pas de binaire créé, et un clic sur la flèche verte ne lance plus le binaire...

    J'ai tout cassé mon Laz, quelle mierda

    [EDIT] Bon, il y a un dieu pour les imbéciles : dans le dossier principal de laz (/usr/share/lazarus/1.0.10), j'ai trouvé 2 binaires : lazarus et lazarus.old.
    J'ai renommé le premier avec un .bad au bout, supprimé .old de l'autre, relancé et ça fonctionne !
    Ouuuuuf ! J'ai eu un coup de chaud, là, et je sens que je vais zapper cette histoire de TAsyncProcess, on va attendre la 1.4 (ou 1.6, ou 1.xxx ) [/EDIT]

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 918
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 918
    Points : 15 353
    Points
    15 353
    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