Page 1 sur 1
[..] Probléme dans l'appel de plusieurs fonctions
Posté : jeu. 18 nov. 2010 21:07
par legend
Bonjour,
j'ai un petit probléme dans le call de fonctions.
je donne un petit exemple :
je met 2hotkeys, a qui call la fonction "a", b qui call la fonction "b".
"a" et "b" durent 5sec chaqune.
j'apuie sur a, aprés 2sec j'apuie sur b
la fonction a n'est pas achevée, le script pause "a" et fait la fonction "b", aprés il reviens finir la fonction a.
il y a pas un moyen, que quand j'apuie a, aprés 2sec j'apuie b => le script attend que a finis pour commencer b.
merci et bonne journée
Re: [..] probléme dans call de plusieurs fonctions
Posté : ven. 19 nov. 2010 18:17
par roselito13
L'autoit de base ne peut faire que une action a la fois.
Pour executer deux action a la fois renseigne tois sur la fonction "Adlib"
http://www.autoitscript.com/autoit3/doc ... gister.htm
Il existe un UDF dans sur se forum pour exécuter encore plus de chose en même temps.
Re: [..] probléme dans call de plusieurs fonctions
Posté : ven. 19 nov. 2010 20:11
par legend
Je connais bien pour l'adlib.
c'est pas vraiment ce que je demande.
je demande si je call une fonction "b" lorsque une fonction "a" est en cours (avec hotkey par exemple), "a" s'arrétera, "b" se déclanchera, a la fin de "b", le script finis "a".
je voudrais savoir s'il y a un moyen, pour que quand "a" est en cours, et il y a eu un call de la fonction "b", le script attend que "a" finis pour commencer "b".
je crois pas que c'est trés dur a comprendre sa ^^)
merci et bonne journée
Re: [..] probléme dans call de plusieurs fonctions
Posté : ven. 19 nov. 2010 20:34
par zeshrek
ma foi, y a une solution, c'est d'utiliser un flag pour chaque fonction
Je détaille pas trop mais un truc du genre :
Code : Tout sélectionner
[le début de ton script]
$EnCours_A = false
$EnCours_B = false
[le corps du script]
func _funcA()
if $EnCours_B = true then
msgbox(1,"Du calme","on attend que B soit fini !!!")
else
$EnCours_A = true
[ta fonction]
$EnCours_A = true
endif
endfunc
func _funcB()
if $EnCours_A = true then
msgbox(1,"Du calme","on attend que A soit fini !!!")
else
$EnCours_B = true
[ta fonction]
$EnCours_B = true
endif
endfunc
Ca devrait venir a bout de ton probleme
Re: [..] probléme dans call de plusieurs fonctions
Posté : ven. 19 nov. 2010 23:11
par legend
J'ai pensé a sa, mais c'est pas totalement ce que je veux.
je donne un exemple :
Code : Tout sélectionner
opt ("sendkeydelay", 1000)
func a()
send ("aaaa")
endfunc
func b()
send ("bbbb")
endfunc
hotkeyset ("a", "a")
kotkeyset ("b", "b")
while 1
sleep (1000)
wend
chaque fonction mettera 4secondes pour le send (1lettre par secondes)
on dis que j'apuie sur a, et aprés 2secondes j'apuie sur b
quand j'aurais apuié sur b le script aura deja écris 2 "a" seulement.
je veux qu'il : finis les 2 "a" qu'il reste dans la fonction "a".
lancer la fonction b (écrire 4 "b") sans que je re-apuie sur b.
sa veut dire au moment ou j'apuie sur b lorsque que a est en cours, il enregistre l'action et attend jusqu'a ce que "a" s'acheve pour commencer "b".
merci et bonne journée
Re: [..] probléme dans call de plusieurs fonctions
Posté : sam. 20 nov. 2010 12:56
par roselito13
Voila je pense que c'est la Solution que tu chercher.
Je t'ais fait le script complet a partir de se que tu nous as donner
Code : Tout sélectionner
opt ("sendkeydelay", 1000)
hotkeyset ("a", "a")
hotkeyset ("b", "b")
$A = False
$B = False
Func a()
If $B = False
exec_a()
Else
AdlibRegister("a", 100)
EndIf
EndFunc
Func exec_a()
$A = True
Send("aaaa")
$A = False
AdlibUnRegister("a")
EndFunc
Func b()
If $A = False
exec_b()
Else
AdlibRegister("b", 100)
EndIf
EndFunc
Func exec_b()
$B = True
Send("aaaa")
$B = False
AdlibUnRegister("b")
EndFunc
While 1
sleep (1000)
Wend
Il existe surement mieux, mais c'est le matin, et puis sa peut te débloque

Re: [..] probléme dans call de plusieurs fonctions
Posté : sam. 20 nov. 2010 16:33
par legend
Euhh, je pense que c'est un code bugué ^^
ce que je veux c'est une commande qui change le systéme de traitement de fonctions par exemple. Sinon c'est peut être possible comme ceci :
► Afficher le texte
Code : Tout sélectionner
#include <timers.au3>
global $timer1, $timer2, $1, $2
Adlibregister ("check", 500)
HotKeySet ("a", "call1")
HotKeySet ("b", "call2")
func check()
Beep (500, 50)
$timer1 = _timer_diff($1)
$timer2 = _timer_diff($2)
if $timer1 > 1000000 then $timer1 = 0 ; si $1 = 0 ou non déclaré.
if $timer2 > 1000000 then $timer2 = 0 ; si $1 = 0 ou non déclaré.
if $timer1 > $timer2 and $timer1 <>0 then
a()
$timer1 = 0
$1 = 0
elseif $timer2 > $timer1 and $timer2 <> 0 then
b()
$timer2 = 0
$2 = 0
endif
EndFunc
func call1()
$1 = _timer_init()
endfunc
func call2()
$2 = _timer_init()
endfunc
func a()
send ("fffffffffffffffffff")
endfunc
func b()
send ("ddddddddddddddddddd")
endfunc
while 1
sleep (1000)
WEnd
Bon voila l'exemple d'un travail manuel beugué

sa marche trés mal ^^
quelqu'un a une bonne solution?
merci et bonne journée
Re: [..] probléme dans call de plusieurs fonctions
Posté : sam. 20 nov. 2010 17:11
par zeshrek
A ce moment là il te faut une gestion de file d'attente.
Donc en début de script tu crées 2 variables :
Puis qqpart dans une section de ton script qui tourne non stop (par ex dans la boucle ou tu attend les retour de ta GUI, ou bien celle ou tu attends que tes users appuient sur le clavier) tu mets le test suivant :
Code : Tout sélectionner
If $EnCours = false and StringLen($FileDattente) > 0 then
_traitement(StringLeft($FileDattente,1))
endif
Ensuite il ne te reste qu'a créer 3 fonctions :
Code : Tout sélectionner
func _funcA()
$FileDAttente = $FileDAttente & "A"
endfunc
func _funcB()
$FileDAttente = $FileDAttente & "B"
endfunc
func _traitement($Touche)
$EnCours = true
switch $Touche
case "A"
[ton traitement de la touche A]
case "B"
[ton traitement de la touche B]
EndSwitch
$EnCours = false
$FileDAttente = FileRight($FileDAttente , StringLen($FileDattente) - 1)
endfunc
Les 2 premières sont appelées par les hotkey. Elles remplissent juste la file d'attente sur pression des touches.
La 3eme traite la file d'attente en mode FIFO, cad elle la vide par la gauche alors qu'elle se remplit par la droite. Donc les traitement se font dans l'ordre ou les touches ont été tapées.
Re: [..] probléme dans call de plusieurs fonctions
Posté : sam. 20 nov. 2010 18:04
par legend
c'est presque le même truc que mon code (ajout de cas de plusieurs demande dans la liste d'attente d'une seule fonction)
cependant, il y a pas une opt ou un udf qui fait cela? . . .
parce que ce sera assés lent pour écrire un code pour 30+ de fonctions comme sa et sa posera quelques problémes quand les fonctions ne seront pas, simples (comme a et b) ^^
merci et bonne journée
Re: [..] probléme dans call de plusieurs fonctions
Posté : sam. 20 nov. 2010 18:58
par roselito13
A mas connaissance, il existe pas d'UDF ou de Commande toute prête pour faire cela.
Tu devras donc prendre le temps de la crée, et pourquoi pas la publier

Re: [..] probléme dans call de plusieurs fonctions
Posté : dim. 21 nov. 2010 08:08
par legend
ok, je j'aissaierai de le faire dés que j'aurais du temp.
bonne journée