Gambas France BETA


Pas de compte ? Incription

Utilisation de SHELL ou EXEC

12
AuteurMessages
caracole#1 Posté le 14/12/2010 à 23:28:00
Bonjour,

Lors de l'utilisation de ces deux commandes, j'aimerai pouvoir afficher une barre de progression- Est-ce possible ?

Si oui, comment ?

J'ai lu dans la documentation Shell que si WAIT est precisé dans la commande, celle-si s'effectue en arriere plan.
comment savoir dans gambas que la commande est terminée ?

Merci
manu#2 Posté le 15/12/2010 à 10:56:00
Avec Gambas ca roule !Oui c'est possible.

Pour qu'une barre de progression fonctionne, il faut d'une part connaitre la durée ou les octets, ou le nombre de passage a faire durant le traitement et d'autre part pouvoir incrémenter la valeur de la barre de progression avec une boucle en générale.

Pour te répondre précisément, il faut donc que l'on connaisse le traitement à réaliser !
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
caracole#3 Posté le 15/12/2010 à 12:24:00
Oui c'est possible.

Pour qu'une barre de progression fonctionne, il faut d'une part connaitre la durée ou les octets, ou le nombre de passage a faire durant le traitement et d'autre part pouvoir incrémenter la valeur de la barre de progression avec une boucle en générale.

Pour te répondre précisément, il faut donc que l'on connaisse le traitement à réaliser !


Bien.

Voici un exemple qui me permet de compiler un projet
J'aimerai pouvoir durant tout le traitement afficher une barre de progression ou ( autre chose ) qui me permette Visuellement de savoir que le traitement est en cours et non un blocage.
Il me parait difficile ( voire impossible ) d'évaluer le temps ....
J'ai pensé a l'usage du timer, mais je ne sais pas tres bien comment gerer les flux du shell
par ailleurs EXEC conviendrait-il mieux que SHELL ?

Merci. Pierre ( caracole )

1
PUBLIC SUB BtnCompile_Click() DIM strOutput AS STRING DIM strTemp AS STRING DIM pathProjet AS STRING pathProjet = DirSelect.SelectedPath BtnCompile.Enabled = FALSE SHELL "cd " & pathProjet & " && " & " gksudo ./configure" WAIT TO strOutput TextOutput.Text = strOutput SHELL "cd " & pathProjet & " && " & " gksudo make" WAIT TO strTemp strOutput = strOutput & strTemp TextOutput.Text = strOutput SHELL "cd " & pathProjet & " && " & " gksudo make install" WAIT TO strOutput strOutput=strOutput & strTemp TextOutput.Text = strOutput BtnCompile.Enabled = TRUEEND
manu#4 Posté le 15/12/2010 à 14:11:00
Avec Gambas ca roule !rhaaaa ! J'ai travaillé sur un projet comme ca, mais je n'ais pas trouvé la solution car on ne connais pas la durée total de la compilation, elle dépend de ton ordi et de la compilation proprement dite.

D'autre par, il te faut utiliser les process :

voila un bout de code que j'ai fait mais qui est plein d'imperfections mais regarde bien l'utilisation des process qui elle, est corecte :

1
PUBLIC SUB Button1_Click()DIM sDesktop AS STRING = Desktop.type FMain.Mouse = 3 TextArea1.Clear ProgressBar1.Visible = TRUE ProgressBar2.Visible = TRUE iNumProcess = 1 Frame1.Text = " Upadte en cours (1/4) ....." fInc = 1 / 2 EXEC ["svn", "update", sMySvn] FOR READ AS "Process" WAIT 5 iNumProcess = 2 Frame1.Text = " ./configure en cours (2/4) ....." ProgressBar1.value = 0 fInc = 1 / 50 SHELL "cd" & sMySvn & " && ./configure" FOR READ AS "Process" WAIT 5 iNumProcess = 3 Frame1.Text = " Make en cours (3/4 )....." ProgressBar1.value = 0 fInc = 1 / 50 EXEC ["make", "-C", sMySvn] FOR READ AS "Process" WAIT 5 iNumProcess = 4 Frame1.Text = " Make install en cours (4/4) ....." ProgressBar1.value = 0 fInc = 1 / 350 IF sDesktop = "KDE" THEN SHELL "cd trunk && kdesu make install" FOR READ AS "Process" ' Normalement cela devrais etre sMySvn a la place de trunk Else 'Shell "cd trunk && gksu make install" For Read As "Process" ' pareil qu'au dessus Mais CA NE MARCHE PAS !!! Exec ["make", "install", "-C", sMySvn] For Read As "Process" ' alors que ca marche pour ./configure ? Endif FMain.Mouse = 3 Wait 5 FMain.mouse = -1 EndPublic Sub Process_Read() Dim sLine As String Read #Last, sLine, -256 sOutput &= sLine TextArea1.Text = sOutput textArea1.Pos = TextArea1.Length ProgressBar1.value = ProgressBar1.value + fInc ProgressBar2.value = ProgressBar2.value + fInc / 3.9 ' Bon là tu as du voir que ca bouillasse pas mal... je sais pas si c'est vraiement solutionable !? EndPublic Sub Process_Kill() ProgressBar1.value = 1 If iNumProcess = 4 Then TextLabel1.Text = " La mise à jour de la révision de " & sMySvn & " s'est bien déroulée" ProgressBar1.Visible = False ProgressBar2.Visible = False f End


Je vois deux pistes un peu foireuses cependant :

1- Tu rajoutes une BDD à ton projet dans lequel tu stock le temps de la dernière compile. La fois suivante tu fais référence a la durée de la dernière compilation. Bonjour le boulot pour une barre de progression !

2- Tu estimes une durée de la manière que tu veux et et la divisde par exemple en 10. Tu fait une boucle qui incrémente de 10 % ta barre de progression le 10 passage tu ne la déclenche qu'a la fin du processus et tu met 100 % (au cas ou au bout de 3 passage de boucle la compil sois fini) :). C'est pas très précis non plus mais ca fait patienter ! :)



Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
caracole#5 Posté le 15/12/2010 à 14:40:00
Merci Manu,

Je vais copier le code et essayer de comprendre ....

Merci
manu#6 Posté le 15/12/2010 à 19:17:00
Avec Gambas ca roule !bon le code ne gère pas que la barre de progression, c'est un projet en cours et très imparfait. Il sert en fait a faire un update SVN (première étape) puis lance la compile.

N’hésite pas a me demander.

je pourrais aussi épurer mon code pour répondre uniquement à ta question mais je t'ai répondu vite fait, je passais par là... ;)

Bonne soirée, j'ai quelque chose à fêter moi ce soir ;)
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
caracole#7 Posté le 15/12/2010 à 19:30:00
bon le code ne gère pas que la barre de progression, c'est un projet en cours et très imparfait. Il sert en fait a faire un update SVN (première étape) puis lance la compile.

N’hésite pas a me demander.

je pourrais aussi épurer mon code pour répondre uniquement à ta question mais je t'ai répondu vite fait, je passais par là... ;)

Bonne soirée, j'ai quelque chose à fêter moi ce soir ;)


Justement Manu, c'est ce que je suis aussi en train de faire.
Suis retraité et débutant en Gambas cependant, j'ai beaucoup pratiqué VB depuis l'existence de Miro-Soft ce qui veut dire pas mal d'années !

J'ai un embryon de quelque-chose qui tourne mais j'aimerai que ce soit un peu plus convivial.
Ce que je cherche surtout c'est d'avoir un outil qui évite de mettre les mains dans 'le cambouis' !

merci pour les conseils

Pierre
linuxos#8 Posté le 16/12/2010 à 00:05:00
Un peu de sel, de poivre et la crevette sera... Bonsoir Caracole,

En effet ce genre de traitement n'est pas facile. Tout d'abord il faut executer ta commande SHELL ou EXEC sous forme de process en lecture (READ).

De cette manière, ta commande sera exécutée en tache de fond et chaque fois que du texte sera renvoyé par ta commande
comme une sortie texte dans un shell, un évènement remontera dans Gambas et tu pourra ainsi traiter chaque ligne qui te sera renvoyé.

A) Le process

PUBLIC SUB Executer_Commande()

DIM sProcessCompil as Process
DIM CompilCmd as String

' Lancement du Process Compil

CompilCmd = "....commande a exécuter ......"

ProcessCompil = SHELL CompilCmd FOR INPUT
Object.Attach(ProcessCompil, ME, "ProcessCompil")

END

PUBLIC SUB ProcessCompil_Read()

' Événement lorsque la commande CompilCmd remonte du texte

DIM sLine AS String

LINE INPUT #LAST, sLine

echo sLine

END

PUBLIC SUB ProcessCompil_Kill()

' Événement quand le Process CompilCmd est terminée ou tué


END

PUBLIC SUB ProcessCompil_Error(erreurTexte AS String)

' Événement lorsque la commande CompilCmd remonte une erreur

IF erreurTexte LIKE "Timeout:*" THEN
echo "Erreur du Process: Timeout !" ' Exemple de traitement d'erreur
END IF

END

B) La barre de progression:

En ce qui concerne la barre de progression, si tu connais le nombre de phase durant ta compilation, tu peux t'en servir comme unité de découpage de ta barre de progression
et ensuite tester dans la Procédure 'ProcessCompil_Read()' si tu vois passer des mot clé comme 'Pre-compilation, Compilation, linkage, etc,...) pour faire avancer ta barre de progression.


Voila c'est une idée que j'ai utilisé plusieurs fois et cela marche plutôt bien.

En cas de plantage de ta commande, celle-ci renverra un 'EXIT 1' ou code 1 en shell qui montera automatiquement l’événement
dans Gambas: PUBLIC SUB ProcessCompil_Error(erreurTexte AS String)

Si tu as des questions n'hésite pas.

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
Gamuti#9 Posté le 16/12/2010 à 23:34:00
Et si simplement tu fais :
- Une barre de progression qui s'incrémente uniquement à la fin du traitement de chaque SHELL
- Une icône qui tourne indiquant à l'utilisateur que ça mouline
- Un bouton qui permet d'afficher le terminal (reste à savoir comment faut-il faire) à la demande.
caracole#10 Posté le 16/12/2010 à 23:43:00
Et si simplement tu fais :
- Une barre de progression qui s'incrémente uniquement à la fin du traitement de chaque SHELL
- Une icône qui tourne indiquant à l'utilisateur que ça mouline
- Un bouton qui permet d'afficher le terminal (reste à savoir comment faut-il faire) à la demande.


Oui bien sur pourquoi pas une icone ( un gif qui tourne ) ca doit bien se trouver quelque-part comme le sablier ....faut-il encore chercher . je n'ai plus wind'ose :)
linuxos#11 Posté le 16/12/2010 à 23:57:00
Un peu de sel, de poivre et la crevette sera... Bien sur il y a plus simple que d'utiliser des Process...

Tu fais juste comme ça:


* Application.Busy = 1

* SHELL = ".... commande a executer....." WAIT

* Application.Busy = 0

et le curseur de la souris changera d'aspect en OCUPPE .....

Il me semblait de comprendre les Process ouvrerai la porte a plein de chose ... mais je me suis trompé .... autant pour moi...
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
manu#12 Posté le 17/12/2010 à 08:07:00
Avec Gambas ca roule !Alors si c'est cela, une icone qui tourne pour faire patienté il y a encore vraiment plus simple, on modifie l'aspet de la souris (je le fait d'ailleurs dans mon bout de code) :

Avant le shell on transforme l'icone en icone d'attente et après on la remet la souris par default : Un truc du style :

me.mouse = 3 '3 est la valeur de mouse qui montre un curseur type sablier , qui dit que ça travail....
shell "montraitement"
me.mouse=1 ' Valeur de la mouse par Default

Tout simplement mais on est très loin de la barre de progression là :)

Quand a l'idée d'une barre de progression par shell, ça va avancer de 30 % a chaque fois, ça va pas être très joli ni très intéressant pour l'utilisateur.
Travailler sur les process me parais beaucoup plus intéressant en terme de résultat et d'apprentissage, non ?
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
linuxos#13 Posté le 17/12/2010 à 08:16:00
Un peu de sel, de poivre et la crevette sera... Manu,


Je crois que nous décrivons la même chose..... :)



me.mouse = 3 '3 est la valeur de mouse qui montre un curseur type sablier , qui dit que ça travail....
shell "montraitement"
me.mouse=1 ' Valeur de la mouse par Default


c'est pareil que:

* Application.Busy = 1

* SHELL = ".... commande a executer....." WAIT

* Application.Busy = 0


olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
manu#14 Posté le 17/12/2010 à 08:21:00
Avec Gambas ca roule !oui t'as raison .... je l'ai vu après .. :oops:

On va dire que ce sont 2 chemins differents pour le meme resultat :lol:
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
Gamuti#15 Posté le 17/12/2010 à 09:17:00
Une autre solution s'offre à nous pour l'utilisation d'un SHELL sans utiliser de WAIT

Tu peux renvoyer le résultat de ce qu'exécute un SHELL vers un fichier TEXT.
Cela donnera un code ressemblant à ceci :
1
SUB Fmain()DIM hFile AS FILEDIM Chaine AS STRINGSHELL "FichierBash.sh > \tmp\resultat.txt"Timer1.Enable=TRUEEND SUB


Comme le SHELL exécute une commande shell en arrière plan, c'est-à-dire, que le shell rend la main à l'interpréteur, tu peux exécuter une boucle sans fin, à intervalles réguliers, pour tester la présence du fichier RESULTAT.TXT, à l'aide d'un Timer :
1
SUB Timer1()DOIF EXIST "\tmp\resultat.txt" THEN EXIT DOLOOP' Ne pas oublier de rajouter des guets sur les retours d'erreurs...


Ensuite, il faut tester le contenu de ton fichier RESULTAT.TXT :
1
hFile = OPEN "\tmp\resultat.txt" FOR INPUTDO WHILE NOT Eof(hFile)LINE INPUT #hFile, ChaineIF Chaine ="MachinChose" THEN IncrementeLaBarreDeProgressionLOOPCLOSE hFileEND SUBSUB IncrementeLaBarreDeProgression()ProgressBar1.Value=ProgresseBar1.Value + 0.1 '1 étant la valeur maximale de la barre de progression et 0 la valeur minimaleEND SUB


J'utilise beaucoup ce genre de procédure pour réaliser ce genre de barre de progression.
Seul inconvénient : Il faut que tu sache le contenu de ce que te renvoi le MAKE pour que tu puisses rajouter des capteurs dans ton fichier RESULTAT.TXT

Personnellement, cette procédure m'est très utile pour récupérer des images sur le net. J'utilise la méthode WGET dans un SHELL car le WGET retourne dans un fichier texte la progression en pourcentage du fichier en cours de téléchargement. Exemple :
1
laurent@laurent-desktop:/tmp$ wget [url=http://games.utilities.free.fr/BISOUNOURS.JPG]http://games.utilities.free.fr/BISOUNOURS.JPG[/url] -P /tmp/ -o /tmp/essai.txt


Partant de ce genre de procédure, le WGET me retourne ce genre de texte, qui devient très facile à exploiter car une liste de progression est enregistrée :
1
--2010-12-17 9:13:24-- [url=http://games.utilities.free.fr/BISOUNOURS.JPGR]http://games.utilities.free.fr/BISOUNOURS.JPGR[/url]ésolution de games.utilities.free.fr... 212.27.63.100Connexion vers games.utilities.free.fr|212.27.63.100|:80... connecté.requête HTTP transmise, en attente de la réponse... 200 OKLongueur: 1483170 (1,4M) [image/jpeg]Sauvegarde en : «/tmp/BISOUNOURS.JPG» 0K .......... .......... .......... .......... .......... 3% 456K 3s 50K .......... .......... .......... .......... .......... 6% 763K 2s 100K .......... .......... .......... .......... .......... 10% 752K 2s 150K .......... .......... .......... .......... .......... 13% 761K 2s 200K .......... .......... .......... .......... .......... 17% 757K 2s 250K .......... .......... .......... .......... .......... 20% 751K 2s 300K .......... .......... .......... .......... .......... 24% 761K 2s 350K .......... .......... .......... .......... .......... 27% 756K 1s 400K .......... .......... .......... .......... .......... 31% 758K 1s 450K .......... .......... .......... .......... .......... 34% 757K 1s 500K .......... .... .......... .......... .......... 37% 757K 1s 550K .......... .......... .......... .......... .......... 41% 737K 1s 600K .......... .......... .......... .......... .......... 44% 753K 1s 650K .......... .......... .......... .......... .......... 48% 758K 1s 700K .......... .......... .......... .......... .......... 51% 760K 1s 750K .......... .......... .......... .......... .......... 55% 755K 1s 800K .......... .......... .......... .......... .......... 58% 753K 1s 850K .......... .......... .......... .......... .......... 62% 762K 1s 900K .......... .......... .......... .......... .......... 65% 760K 1s 950K .......... .......... .......... .......... .......... 69% 754K 1s 1000K .......... .......... .......... .......... .......... 72% 757K 1s 1050K .......... .......... .......... .......... .......... 75% 761K 0s 1100K .......... .......... .......... .......... .......... 79% 751K 0s 1150K .......... .......... .......... .......... .......... 82% 760K 0s 1200K .......... .......... .......... .......... .......... 86% 758K 0s 1250K .......... .......... .......... .......... .......... 89% 752K 0s 1300K .......... .......... .......... .......... .......... 93% 738K 0s 1350K .......... .......... .......... .......... .......... 96% 757K 0s 1400K .......... .......... .......... .......... ........ 100% 764K=2,0s2010-12-17 09:13:26 (739 KB/s) - «/tmp/BISOUNOURS.JPG» sauvegardé [1483170/1483170]
12