[R] Lecture de fichier log (asynchrone)

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
ze0ne
Niveau 1
Niveau 1
Messages : 3
Enregistré le : mer. 12 févr. 2014 13:35
Status : Hors ligne

[R] Lecture de fichier log (asynchrone)

#1

Message 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.
Modifié en dernier par ze0ne le jeu. 13 févr. 2014 15:23, modifié 1 fois.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

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

#2

Message 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
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
ze0ne
Niveau 1
Niveau 1
Messages : 3
Enregistré le : mer. 12 févr. 2014 13:35
Status : Hors ligne

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

#3

Message 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 :)
Modifié en dernier par ze0ne le ven. 14 févr. 2014 11:02, modifié 1 fois.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

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

#4

Message 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.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
ze0ne
Niveau 1
Niveau 1
Messages : 3
Enregistré le : mer. 12 févr. 2014 13:35
Status : Hors ligne

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

#5

Message 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
Modifié en dernier par ze0ne le ven. 14 févr. 2014 11:03, modifié 1 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#6

Message par Tlem »

@ze0ne
Merci de bien vouloir rajouter les balises de code que vous avez oublié dans vos deux dernier messages ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre