Gambas France BETA


Pas de compte ? Incription

Shell

Ce sujet est résolu.

12
AuteurMessages
valaquarus#1 Posté le 11/3/2021 à 11:33:33
-- Unus Ex Altera --Bonjour à tous,
dans un programme comment récupérer pour affichage, par exemple dans un textArea, l'information de l'avancée d'un travail, pas les erreurs, lancé par une commande shell dans un terminal?
Je n'arrive pas à le faire en temps réel.
Philippe.
Système d'exploitation : KDE neon 6.0.2 ~ Version Gambas : 3.19.90
vuott#2 Posté le 11/3/2021 à 19:42:39
Ne cedere ineluctabili possimusTu pourrais utiliser les ressources de la classe "Process".

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PRIVATE pr AS Process


PUBLIC SUB Button1_Click()

' Ouvre le processus pour la "lecture" des données:
pr = SHELL "nom_du_programme" FOR READ AS "processus" ' ou: For Input

END


PUBLIC SUB processus_Read()

DIM s AS STRING

' Par exemple, il lit une chaîne de texte à partir du processus:
LINE INPUT #pr, s

TextArea.Text &= s & gb.NewLine

END
valaquarus#3 Posté le 11/3/2021 à 20:21:03
-- Unus Ex Altera --Merci Vuott,
mais ce n'est pas ce que je veux car ça, je sais l'utiliser et cela fourni les informations sur le résultat du processus en cours mais j'aimerais obtenir des informations, non sur ce que fais le processus, mais où il en est de son traitement total, par exemple, lui faire indiquer : "je commence mon traitement", "je viens de finir 20% de mon traitement", etc..
En fait comment suivre en temps vraiment "réel" le traitement du processus et non pas le résultat de ce qu'il produit.
Philippe.
Système d'exploitation : KDE neon 6.0.2 ~ Version Gambas : 3.19.90
vuott#4 Posté le 12/3/2021 à 14:08:01
Ne cedere ineluctabili possimusehmmm... je pense qu'il faut évidemment savoir ce que le programme externe doit faire et ce qu'il fait à chaque instant.
valaquarus#5 Posté le 12/3/2021 à 16:02:37
-- Unus Ex Altera --Vuott,
le problème est bien de suivre un processus dans son déroulé mais celui-ci te renvoie les infos quand il veut sur la console et surtout quand il y a des erreurs ou bien quand il a fini ; sur un traitement relativement long c'est barbant à suivre j'aimerais le rendre un peu plus bavard pour ne pas dire verbeux.
Philippe
Système d'exploitation : KDE neon 6.0.2 ~ Version Gambas : 3.19.90
vuott#6 Posté le 12/3/2021 à 17:16:53
Ne cedere ineluctabili possimus
...mais celui-ci te renvoie les infos quand il veut sur la console et surtout quand il y a des erreurs ou bien quand il a fini

Je suppose que cela dépend du programme externe, qui envoie les informations à "Standard Output" ou à "Standard Error" selon les dispositions spécifiques de son code. :roll:
valaquarus#7 Posté le 13/3/2021 à 18:02:34
-- Unus Ex Altera --Bonsoir Vuott,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
hProc = SHELL (Comm) FOR READ AS "Scan"

PUBLIC SUB TournProc() 'tant que tourne le process
WHILE hProc.state = hProc.Running
WAIT 1
FMain.Mouse = Mouse.Wait
FMain.textArea.Mouse = Mouse.Wait
WEND
END

PUBLIC SUB Scan_read() 'affichage dans terminal
DIM sLine AS STRING
sline = READ #hProc, Lof(hproc)
FMain.textArea.Text &= sLine
FMain.textArea.EnsureVisible()
END


Tu vois j'utilise bien la classe process mais je peux attendre longtemps avant que le textArea affiche quelque chose et cela peut être perturbant pour l'utilisateur.

Philippe
Système d'exploitation : KDE neon 6.0.2 ~ Version Gambas : 3.19.90
valaquarus#8 Posté le 13/3/2021 à 18:16:43
-- Unus Ex Altera --
Vuott a écrit :
ehmmm... je pense qu'il faut évidemment savoir ce que le programme externe doit faire et ce qu'il fait à chaque instant.

Je n'ai pas encore creusé de ce côté mais c'est à l'évidence en regardant ce que fait le programme appelé par le shell que peut être je peux récupérer des informations à afficher pour l'utilisateur pour qu'il ait bien l'impression que son programme est encore en vie, le curseur d'attente c'est pas cool au bout d'un moment.
Philippe.
Système d'exploitation : KDE neon 6.0.2 ~ Version Gambas : 3.19.90
spheris#9 Posté le 14/3/2021 à 18:26:11
je ferais ça :

1
2
3
PUBLIC button1_clic()
EXEC [ "macommandeshell" ] TO textarea1
END


et ça marche :
http://gambaslinux.fr/articles.php?lng=fr&pg=289
;)
valaquarus#10 Posté le 16/3/2021 à 07:50:06
-- Unus Ex Altera --Bonjour à tous,
oui Sphéris ça aussi fonctionne mais j'ai besoin de récupérer certaines informations bien ciblées que renvoie la commande lancée par le shell et donc de toutes les ranger ligne par ligne dans le textArea. De plus la commande ne renvoie que les informations que l'on sélectionne avant de lancer la commande par le shell donc c'est Vuott qui a pleinement raison, il faut aller chercher du côté de la commande qui elle est une commande que je qualifierais de commande à tiroir car il n'y a pas qu'une action entreprise par celle-ci mais bien plusieurs et donc il faut soit que je me forme à cette commande soit que je contourne le problème en affichant dans un deuxième terminal un "truc" qui occupe visuellement l'utilisateur genre horloge qui défile ou # qui s'incrémente.
Et comme mon objectif premier (et que je suis très fainéant) était de montrer que le logiciel était en fonction pendant tout le temps du traitement qui peut être vraiment lent, vous aurez compris que je vais utiliser cet artifice qui matérialise le temps qui passe.

Philippe
Système d'exploitation : KDE neon 6.0.2 ~ Version Gambas : 3.19.90
vuott#11 Posté le 16/3/2021 à 14:52:43
Ne cedere ineluctabili possimusLa solution classique, proposée par notre ami spheris, n'offre des informations qu'au début du processus du programme externe, mais pas pendant son fonctionnement.
valaquarus#12 Posté le 16/3/2021 à 17:34:02
-- Unus Ex Altera --Bonsoir,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
hProc = SHELL (Comm) FOR READ AS "Scan" 'mon processus

PUBLIC SUB Scan_read() 'affichage dans terminal

DIM sLine AS STRING

' sline = Read #hProc, Lof(hProc) ' ou suivant
READ #hProc, sline, Lof(LAST) ' ou précédent
FMain.textArea.Text &= sLine
FMain.textArea.EnsureVisible()

END

PUBLIC SUB TournProc() 'tant que tourne le process

DIM i, j AS INTEGER

IF FMain.langue = "es" THEN j = 50
IF FMain.langue = "fr" THEN j = 50
IF FMain.langue = "en" THEN j = 50
IF FMain.langue = "de" THEN j = 57
IF FMain.langue = "it" THEN j = 51
IF FMain.langue = "pt" THEN j = 45
IF FMain.langue = "ru" THEN j = 49

FMain.textArea2.Text = (" Trabajo en curso... ")
WHILE hProc.state = hProc.Running
WAIT 1
FMain.Mouse = Mouse.Wait
FMain.textArea.Mouse = Mouse.Wait
FMain.textArea2.Mouse = Mouse.Wait
FMain.textArea.ScrollBar = Scroll.None
FMain.textArea2.Visible = TRUE
FMain.textArea2.Text &= "#"
i += 1
IF i > j THEN
i = 0
FMain.textArea2.Clear
FMain.textArea2.Text = (" Trabajo en curso... ")
FMain.textArea2.Text &= "#"
ENDIF
WEND
FMain.textArea2.Clear
FMain.textArea2.Visible = FALSE
FMain.textArea.ScrollBar = Scroll.Both

END

Voilà bêtement mon tourne autour du problème.
Si vous n'avez pas de commentaires supplémentaires je passe le sujet en résolu.
Philippe.

C'était pour faire avancer le smilblich.

Système d'exploitation : KDE neon 6.0.2 ~ Version Gambas : 3.19.90
spheris#13 Posté le 17/3/2021 à 19:44:40
Pardon, je n'avais pas bien lu la question.
Une piste :
Ton appli externe n'a-t-elle pas une option à passer en ligne de commande genre '-s'(step by step) '-d' (detail), etc...?
valaquarus#14 Posté le 18/3/2021 à 14:17:01
-- Unus Ex Altera --Bonjour Sphéris,
oui et non, en fait c'est une commande plurielle qui réalise plusieurs opérations les unes à la suite des autres, il s'agit de clamscan de clamav que l'on peut régler pour qu'elle "parle" mais là on a un très long discours pas toujours clair sur l'état d'avancement des fichiers traités.
Philippe
PS. : tu avais une idée derrière la tête en parlant de :
Ton appli externe n'a-t-elle pas une option à passer en ligne de commande genre '-s'(step by step) '-d' (detail), etc...?
Système d'exploitation : KDE neon 6.0.2 ~ Version Gambas : 3.19.90
spheris#15 Posté le 21/3/2021 à 19:42:27
J'ai trouvé.
La commande WATCH sous linux te permet de faire ce que tu demandes.

Exemple tiré d'un site pour la commande dd par exemple avec actualisation toutes les 30 secondes:

terminal (en root):

kill -USR1 9999
Cette seconde commande peut-être lancée de temps en temps pour patienter. Alternative en mode root, pour voir la progression toutes les 30 secondes:

watch -n 30 kill -USR1 9999


Edition du message :
En fait non, cela ne marche pas correctement.
Il suffit d'utiliser la commande pv qui elle fonctionne très bien :
voir ici :
https://www.linuxtricks.fr/wiki/pv-avoir-des-informations-sur-le-temps-d-une-tache

12