[..] Bouton, Case | Comment annuler une autre fonction ?

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
cbourree
Niveau 5
Niveau 5
Messages : 104
Enregistré le : sam. 05 févr. 2011 18:07
Localisation : Lyon
Status : Hors ligne

[..] Bouton, Case | Comment annuler une autre fonction ?

#1

Message par cbourree »

Bonjour,
J'ai appris Autoit grâce à ce tutoriel http://www.siteduzero.com/tutoriel-3-22 ... utoit.html
Je ne suis pas sur le PC avec mon programme donc vous n'aurez pas de code mais juste des explications :
Imaginons que j'ai deux boutons, je clique sur le premier qui m'envoi donc sur une fonction très longue.
Case $Buton1
:o fonction_très_longue()
Et je voudrai savoir comment faire pour que le deuxième bouton arrête tout de suite l'autre. Même si les calcules ne sont pas terminés.
Case $Bouton2
:) stop_bouton1()
Merci d'avance
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] Bouton, Case | Comment annuler une autre fonction

#2

Message par zeshrek »

Si ta fonction tres longue est une boucle, c'est faisable. Il suffit que tu mettes un GUIGetMsg() dedans pour intercepter le clic sur le boutton 2 et que tu fasses un return en cas de clic.
Par contre si ta fonction est linéaire... a part en parsemant ton code de GUIGetMsg() je ne vois pas trop.
Si vis pacem para bellum
Avatar du membre
cbourree
Niveau 5
Niveau 5
Messages : 104
Enregistré le : sam. 05 févr. 2011 18:07
Localisation : Lyon
Status : Hors ligne

Re: [..] Bouton, Case | Comment annuler une autre fonction

#3

Message par cbourree »

Je ne suis pas un pro :
"que tu fasses un return en cas de clic." Je ne comprend pas, Késako ? a quoi sa sert ?
Avatar du membre
sksbir
Niveau 7
Niveau 7
Messages : 384
Enregistré le : lun. 26 oct. 2009 17:57
Localisation : Lyon
Status : Hors ligne

Re: [..] Bouton, Case | Comment annuler une autre fonction

#4

Message par sksbir »

cbourree a écrit :Je ne suis pas un pro :
"que tu fasses un return en cas de clic." Je ne comprend pas, Késako ? a quoi sa sert ?

Code : Tout sélectionner

func fonction_tres_longue()

for I=1 to 100000000000000000000000000000
; mon calcul
;blablabla ... c'est ton calcul hein...
; interception:
if GUIGetMsg()=$AUTREBOUTON then return
next
endfunc
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Bouton, Case | Comment annuler une autre fonction

#5

Message par Iste »

Le mode événementiel pourrait il aider ?
Signez ici
Avatar du membre
cbourree
Niveau 5
Niveau 5
Messages : 104
Enregistré le : sam. 05 févr. 2011 18:07
Localisation : Lyon
Status : Hors ligne

Re: [..] Bouton, Case | Comment annuler une autre fonction

#6

Message par cbourree »

Donc si j'ai bien compris je doit faire une ligne if pour tous les autres boutons ?

Code : Tout sélectionner

func fonction_tres_longue()

for I=1 to 100000000000000000000000000000
; mon calcul
;blablabla ... c'est ton calcul hein...
; interception:
If GUIGetMsg()=$AUTREBOUTON then return
next
Endfunc
 
next ? Sa sort de la case ?
Avatar du membre
sksbir
Niveau 7
Niveau 7
Messages : 384
Enregistré le : lun. 26 oct. 2009 17:57
Localisation : Lyon
Status : Hors ligne

Re: [..] Bouton, Case | Comment annuler une autre fonction

#7

Message par sksbir »

cbourree a écrit :Donc si j'ai bien compris je doit faire une ligne if pour tous les autres boutons ?
ha.. si tu as d'autres boutons, alors ça se complique..
next ? Sa correspond a un ExitCase ?
Non, "next" correspond au "for" qui est au dessus.


mais sinon, c'est quoi cette fonction très longue au juste ? ça nous aiderait de le savoir pour pas te proposer des solutions un peu au pif...
Avatar du membre
cbourree
Niveau 5
Niveau 5
Messages : 104
Enregistré le : sam. 05 févr. 2011 18:07
Localisation : Lyon
Status : Hors ligne

Re: [..] Bouton, Case | Comment annuler une autre fonction

#8

Message par cbourree »

Je n'avais pas vu le for.
J'ai l'impression que personne ne va prendre le temps de m'expliquer alors imaginons que je fasse un bouton stop, cela facilitera les choses ?
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Bouton, Case | Comment annuler une autre fonction

#9

Message par GaRydelaMer »

Une autre solution


une variable Globale

$bCancel = False

Avec la GUI ajouter : un bouton annuler et GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")

Avec comme code:

Code : Tout sélectionner

Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $wParam, $lParam
    Local $iCtrl = BitAND($wParam, 0x0000FFFF)
    If $iCtrl = $Bt_Annuler Then
        Local $Msg = "Voulez-vous vraiment arrêter le process ?"
        If MsgBox(4 + 32 + 256 + 4096, "Arrêt", $Msg, 10) = 6 Then $bCancel = True
    EndIf
EndFunc   ;==>_WM_COMMAND
 
Puis dans ta longue fonction

Si c'est une boucle:

Code : Tout sélectionner

While True And Not $bCancel
    ....
    ....
    ....
wend
Sinon à toi de tester la variable $bCancel dans la suite de ton programme.
Avatar du membre
cbourree
Niveau 5
Niveau 5
Messages : 104
Enregistré le : sam. 05 févr. 2011 18:07
Localisation : Lyon
Status : Hors ligne

Re: [..] Bouton, Case | Comment annuler une autre fonction

#10

Message par cbourree »

Merci beaucoup je n'ai pas mon code donc je peux pas tester mais je pense que sa va marcher.
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Bouton, Case | Comment annuler une autre fonction

#11

Message par GaRydelaMer »

Dernier point

c'est vrai que sans code c'est pas évident de bien répondre.

Oublie pas, le code que je t'ai donné avant marche très bien avec un While ou un Do, dans le cas d'un For pense à

Return, sortira de la fonction en renvoyant une valeur si besoin est

Code : Tout sélectionner

If $bCancel Then Return SetError(1,0, "Annuler")
Dans ta fonction appelante, tu pourras récupérer une erreur

Code : Tout sélectionner

local $Return = TaLonguuuuuuueeeeeeFonctionnnnn()
If @error Then
    If $Return = "Annuler" Then
        $bCancel = False
        MsgBox(0,"", "Vous avez annuler")
    Endif
EndIf
Un autre truc c'est un ExitLoop, qui sortira de la boucle et continuera le traitement a la suite de la boucle avant le retour de ta fonction.
Avatar du membre
sksbir
Niveau 7
Niveau 7
Messages : 384
Enregistré le : lun. 26 oct. 2009 17:57
Localisation : Lyon
Status : Hors ligne

Re: [..] Bouton, Case | Comment annuler une autre fonction

#12

Message par sksbir »

cbourree a écrit :Je n'avais pas vu le for.
J'ai l'impression que personne ne va prendre le temps de m'expliquer alors imaginons que je fasse un bouton stop, cela facilitera les choses ?
J'ai donné un exemple qui illustre la proposition de zeshrek.( rappel : la proposition , c'est "que tu fasses un return en cas de clic" )

Donc, quand tu vas cliquer, comme ton programme sera dans la boucle de 1 à 1000000000 car en train de calculer ta fonction, GUIGetMsg() va prendre la valeur du truc que t'as cliqué, et si c'est le bon, ça sortira de la fonction.

Et sinon, oui, tu peux faire un test pour chaque bouton potentiellement cliquable dans ton interface au moment de la boucle de calcul.
Avatar du membre
cbourree
Niveau 5
Niveau 5
Messages : 104
Enregistré le : sam. 05 févr. 2011 18:07
Localisation : Lyon
Status : Hors ligne

Re: [..] Bouton, Case | Comment annuler une autre fonction

#13

Message par cbourree »

cbourree a écrit :Merci beaucoup je n'ai pas mon code donc je peux pas tester mais je pense que sa va marcher.
Je me cite moi même :lol: Je suis qu'un égocentrique.
Non rien a dire d'autre, merci
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [..] Bouton, Case | Comment annuler une autre fonction

#14

Message par timmalos »

Je viens au devant : Si cette solution ne marche pas nous aurons besoin de votre code source entier pour pouvoir vous aider, vous nous donnez trop peu d'informations. Merci
Répondre