Gambas France BETA


Pas de compte ? Incription

déroulemnt du code

1
AuteurMessages
jibi#1 Posté le 1/9/2011 à 09:03:17
codergambas.jimdofree.comBonjour à tous
j'ai une interrogation au sujet du déroulement du code
je m'explique :

1
2
3
4
5
6
7
PUBLIC SUB button_click()
intruction1
fonction()
instruntion2
hclass.procedure()
instruction3
END


Dans ce bout de pseudo code, instruction3 est exécuté avant que hClass.procedure() ne soit fini d'être exécuté
Si je veux que instruction3 soit éxécuté après le retour de hClass, il faut que je remplace hClass par quoi?
Est ce que avec instruction2 se sera pareil que avec instruction3
Debian GNU/Linux 11 64-bit

Prokopy#2 Posté le 1/9/2011 à 17:33:03
Kinder PinguiEn principe le code se déroule de façon linéaire, c'et-à-dire que instruction3 attend que hclass.procedure() soit terminé.

Qu'est-ce qui te permet de dire que hclass.procedure() est terminé ou non ? Est-ce que hclass est une Form ou un contrôle ?
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
jibi#3 Posté le 1/9/2011 à 17:52:52
codergambas.jimdofree.comBonsoir Prokopy

dans hClass j'ai un process pour lequel je sais qu'il est fini quand l'évènement process_kill est levé
A ce momment là je sais que hClass est terminée

pourtant hClass n'est pas terminée et instruction3 est lancée

????
Debian GNU/Linux 11 64-bit

Prokopy#4 Posté le 1/9/2011 à 18:07:35
Kinder PinguiSi tu n'utilises pas la syntaxe EXEC "programme" WAIT ou EXEC "programme" To variable , alors l'instruction Exec n'attend pas que le programme soit terminé pour continuer, le programme est lancé en parallèle.
Ainsi, ton programme continue tranquillement tandis que le programme s'exécute. C'est à cela que servent les évènements _Read() et _Kill(), pour que tu puisses intercepter ce que fait ton programme et quand il a terminé, et ce à tout moment.
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
jibi#5 Posté le 1/9/2011 à 18:33:38
codergambas.jimdofree.comoui effectivement c'est ce que je me suis aperçu
mais si je met wait, je ne peux afficher le déroulement du log retour par exemple dans une texteaera au fur et a mesure de sa sortie!

donc j'ai mis la suite des instructions dans process_kill

merci prokopy
Debian GNU/Linux 11 64-bit

manu#6 Posté le 3/9/2011 à 15:12:28
Avec Gambas ca roule !
si je met wait, je ne peux afficher le déroulement du log retour par exemple dans une texteaera au fur et a mesure de sa sortie!


Bonjour,

Si si tu peux...

dans ta fonction :

1
2
3
4
5
PUBLIC SUB TaFonction()
traitement_1 WAIT FOR READ AS "MonProcess" 'Wait attendra la fin du processus avant de commencer le Traitement_2

traitement_2 WAIT FOR READ AS "MonProcess"
END


Puis tu lit ton processus avec l'évènement Read

1
2
3
4
5
6
7
8
9
10
11
PUBLIC SUB MonProcess_Read()

DIM sLine AS STRING

READ #LAST, sLine, -256

TextArea1.pos = TextArea1.Length ' Positionne le curseur sur la dernière ligne de la textArea
TextArea1.Insert(sLine) ' insert la ligne
WAIT 0.0005 ' ce Wait permet à l'utilisateur de reprendre la main (pour annuler par exemple). Il n'est pas obligatoire
Autres_actions ' là tu peux par exemple, incrémenter une barre de progression...
END


Puis Kill te permet de dire ce qu'il faut faire a la fin du processus

1
2
3
4
5
PUBLIC SUB Process_Kill()

Message.Info("Processus tèrminé"

END


Voila :)

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)
jibi#7 Posté le 4/9/2011 à 14:34:12
codergambas.jimdofree.comBonjour et bon Dimanche
Salut MAnu

Manu dans ton exemple je suppose que traitement_1 <> traitement_2

une fois traitement_1 fini il s'affichera dans la textaera
ensuite
une fois traitement_2 fini il s'affichera dans la texteaera

mais ni traitement_1, ni traitement_2 ne s'afficheront dans la textaera au fur et à mesure de leur lecture par Process => si tu as un process qui dure 30 mn, pendant 30 mn la texteaera sera vide

par contre si tu ne mets pas WAIT traitement_1 et 2 s'afficheront au fur et à mesure dans la textaera, mais dans ce cas il ne faut pas mettre traitement_2 dessous le 1 sinon le 2 se lancera juste apres et se melangeront dans la texteaera

enfin, moi c'est ce que j'en vu après avoir essayé plusieurs façon de faire!
mais je suis preneur d'autres solutions

a plus
jean-luc
Debian GNU/Linux 11 64-bit

manu#8 Posté le 4/9/2011 à 15:31:56
Avec Gambas ca roule !Si il s'afficherons au fur et à mesure à condition que dans la fonction MonProcess_Read tu effectue une action apres chaque lecture du flux de sortie. Tu peux, par exemple, incrementer une barre de progression ou même une variable.

J'ai effectivement constaté comme toi que cela ne s'affiche pas autrement . ?

Le traitement 2 ne commencera que quand le traitement 1 sera totalement fini et tu pourra suivre les processus dans ta TextArea. :)

Je ne comprends pas pourquoi ceci dit ;).

J'ai posé la question sur la mailing list mais aucune suggestion ne fonctionne.. :oops: :oops:
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)
jibi#9 Posté le 4/9/2011 à 15:55:59
codergambas.jimdofree.com
il s'afficherons au fur et à mesure à condition que dans la fonction MonProcess_Read tu effectue une action apres chaque lecture du flux de sortie

voilà ce que j'ai en process:

1
2
3
4
5
6
7
PUBLIC SUB Process_Read()
DIM sLigne AS STRING
Application.Busy = 1
READ #LAST, sLigne, -256
TextArea1.Text &= sLigne
log &= sLigne
END


Là, pour moi rien ne s'affiche au fur et à mesure si je met WAIT
Si je veux que cela affiche il faut que je mette quoi, si je n'ai pas de barre de progresion? : j'incrémente, si on peut dire une variable mais de type string! mais pas d'affichage continu avec WAIT

1
2
3
4
5
6
7
8
9
PUBLIC SUB Process_Kill()
Application.Busy = 0
'les instructions quand le proces est fini
FCT_intructionsuivantes()
END

PUBLIC SUB Process_Error(erreur AS STRING)
TextArea1.Text &= "=> " & erreur
END
Debian GNU/Linux 11 64-bit

manu#10 Posté le 4/9/2011 à 18:53:16
Avec Gambas ca roule !et la ?

1
2
3
4
5
6
7
8
9
PUBLIC SUB Process_Read()
DIM sLigne AS STRING
DIM i AS INTEGER
Application.Busy = 1
READ #LAST, sLigne, -256
TextArea1.Text &= sLigne
log &= sLigne
INC i
END


Ca devrais marcher !
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)
jibi#11 Posté le 4/9/2011 à 19:46:06
codergambas.jimdofree.comBen euhhhh :affraid: non !

c'est pas ben grave, je pase par process_Kill pour la suite
mais je comprend pas que cela marche chez toi et pas sur mon code, pourtant simple

j'ai testé avec une commande simple comme ls sur un gros dossier => des que je met wait pas d'affichage immédiat mais à la fin du processus

Bonne soirée
Debian GNU/Linux 11 64-bit

manu#12 Posté le 4/9/2011 à 20:43:59
Avec Gambas ca roule !Voila exactement ce que j'ai mis moi :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PUBLIC SUB Process_Read()

DIM sLine AS STRING
DIM i AS INTEGER

READ #LAST, sLine, -256

TextArea1.pos = TextArea1.Length
TextArea1.Insert(sLine)
WAIT 0.0005
INC i

PRINT sLine
END


et ça marche !
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)
jibi#13 Posté le 5/9/2011 à 16:32:15
codergambas.jimdofree.comMerci Manu
OUI c'est OK, en fait c'est grâce à print

aplus
Debian GNU/Linux 11 64-bit

1