Page 1 sur 1

[R] Lecture de fichier log (asynchrone)

Posté : mer. 12 févr. 2014 13:45
par ze0ne
Bonjour à tous, je débute sous AutoIt, j'ai réalisé mon GUI avec Koda, à ce niveau tout fonctionne.

En fait j'ai un serveur dédier sous Linux (Debian) sur lequel se trouve un script python que je souhaite exécuter depuis mon appli AutoIt.
Pour cela, je me connecte à mon serveur via plink.exe et je lui envoie la ligne de commande (qui inclus les paramètres de connexion au serveur ainsi que les instructions pour l’exécution du dit script).

J'ai eu un peu de mal, mais ça aussi ça fonctionne, seulement le traitement est relativement long et je souhaiterai pouvoir suivre l’évolution du traitement depuis AutoIt, dans un GUICtrlCreateEdit(). En effet mon script depuis la console (en ssh) affiche une progression en % ainsi que le suivis des étapes du processus.

Je souhaiterai afficher cette progression dans AutoIt.
J'ai d'abord pensé à écrire cette progression dans un fichier, sous forme de log via la commande ">" de Linux.

Je me retrouve donc un fichier log.txt (sur mon serveur) qui s'écrit au fur et à mesure du processus.
C'est le contenu de ce fichier que je souhaite afficher ou si il existe une technique plus adaptée, c'est encore mieux.

La première étape consiste à télécharger le fichier pour le stocker ee local avec InetGet() puisque InetRead() me retourne un résultat en hexadecimal (pas en console mais une fois dans le GUI)

Code : Tout sélectionner

$file = InetGet($remoteLog,'log.txt',1)
J'ai donc un fichier en local qui contient le contenu du la progression issue de mon script Python distant.
J'affiche, le contenu de ce fichier txt dans mon GUI avec.

Code : Tout sélectionner

For $i = 1 To _FileCountLines('log.txt')           
    GUICtrlSetData($Edit1, GUICtrlRead($Edit1)&@CRLF&FileReadLine('log.txt', $i))
Next
Quand je clique sur le bouton de mon GUI, le processus s'exécute, le fichier est créé sur le serveur, mais rien ne s'affiche.
En effet, je télécharge le fichier mais celui-ci n'existe pas encore à cette étape. Pour cela, il faut que je télécharge le fichier log une fois celui-ci créé, c'est tout à fait logique.

Pour simuler ce comportement, j'ajoute un Sleep(), dans de cas, mon fichier est bel et bien téléchargé en local, mais ne contient que les premières instructions (puisque le traitement n'est pas terminé côté serveur).

Comment dois-je procéder pour récupérer en temps réel les informations de mon fichier log.txt distant ? et l'afficher dans mon GUI pendant son écriture ?

Ou alors comment puis-je récupérer le contenu de ma fenêtre plink.exe, lancée via la commande suivante:

Code : Tout sélectionner

Local $pid = Run('plink.exe -load '&$session&' '&$cli&'  > log.txt', '', @SW_HIDE)
Pour afficher la progression dans ma Zone d'édition du Gui ?
Ça doit être faisable avec (opt_flag) avec STDIN... mais je n'y suis pas parvenu pour le moment.

Dans l'idéale, je souhaiterai également afficher une barre de progression, mais visiblement je n'ai pas encore asses d'expérience pour réaliser cela.

D'avance merci.

Re: [..] Lecture de fichier log (asynchrone)

Posté : mer. 12 févr. 2014 15:03
par jguinch
Salut zeOne, bienvenue à toi sur le forum.
Tu peux essayer de regarder du côté de StdoutRead(), qui te permettra le lire le flux en temps réel.

Un petit exemple, pour mkisofs, qui ressemble un peu à ce que tu veux faire (enfin je pense) :
► Afficher le texte

Re: [..] Lecture de fichier log (asynchrone)

Posté : jeu. 13 févr. 2014 01:05
par ze0ne
Merci pour tout.

J'ai ajouté $STDIN_CHILD a mon Run.

J'ai donc éditer mon code pour ajouter ceci

Code : Tout sélectionner

While 1
    $line = StdoutRead($pid)
    GUICtrlSetData($Edit1,GuiCtrlRead($Edit1)&@LF&$line)
    ConsoleWrite($line)
Wend
J'ai donc ma progression dans ma console, mais dans mon Editbox, j'ai un effet de scintillement désagréable.

Je suppose qu'il est du au setData qui refresh l'intégralité de ma box, hors il devrai se contenter d'afficher la ligne suivante (comme la console).

Malheureusement je n'arrive pas obtenir le résultat escompté, je continue mes tests :)

Re: [..] Lecture de fichier log (asynchrone)

Posté : jeu. 13 févr. 2014 08:26
par jguinch
Dans ta boucle While, tu rafraichis en permanence la zone de texte, d'où ce scintillement désagréable.
Je pense qu'il faudrait ne rafraichir la liste que si nécessaire, du genre en vérifiant que $line n'est pas vide.

Re: [..] Lecture de fichier log (asynchrone)

Posté : jeu. 13 févr. 2014 15:23
par ze0ne
Ok merci c'est nickel, j'ai ajouté une condition comme ceci :

Code : Tout sélectionner

 While 1
    $output= StdoutRead($foo)
    If @error Then ExitLoop

    If NOT @Error Then
        IF $line Then
            GUICtrlSetData(-1, $output&@CRLF, 1)
        EndIf
    EndIf

Wend

Re: [R] Lecture de fichier log (asynchrone)

Posté : ven. 14 févr. 2014 00:12
par Tlem
@ze0ne
Merci de bien vouloir rajouter les balises de code que vous avez oublié dans vos deux dernier messages ...