Page 1 sur 1
[R] Comment fermer un script qui tourne en boucle.
Posté : dim. 26 juil. 2015 17:55
par Boulanza
Bonjour,
J'ai une GUI avec deux boutons le premier pour lancer le scripte (Go), le deuxième bouton me permet de quitter le scripte.
Mon problème : Impossible d’arrêter mon scripte qui tourne en boucle (While 1/WEnd) avec le bouton « Quitter » dans lequel j’ai mis la fonction Exit. J’ai beau chercher par moi-même, mais je ne trouve pas la solution. Alors Comment sortir de la boucle et fermer le script.
Merci pour votre aide…
Cordialement.
Re: [..] Comment sortir de la boucle et fermer le script.
Posté : dim. 26 juil. 2015 18:04
par mikell
Ben et le code ? où l'est le code ?

Re: [..] Comment fermer un script qui tourne en boucle.
Posté : dim. 26 juil. 2015 18:27
par Boulanza
Re-Bonjour,
J'ai pas le code en main.
J'ai changé le titre (Comment fermer un script qui tourne en boucle.) de ma demande pour qu'elle soit une solution générale à tous script qui tourne en boucle.
Cordialement.
Re: [..] Comment fermer un script qui tourne en boucle.
Posté : dim. 26 juil. 2015 18:45
par TiDi
Salut,
Voici une solution :
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$GUI = GUICreate("GUI", 200, 100, 200, 130)
$Bouton1 = GUICtrlCreateButton("Go", 5, 5, 190, 25)
$Bouton2 = GUICtrlCreateButton("Fermer", 5, 35, 190, 25)
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
Switch $msg
Case $Bouton1
; Ton script
Case $Bouton2
Exit
EndSwitch
WEnd
J'ai vérifié, ça marche très bien

Re: [..] Comment fermer un script qui tourne en boucle.
Posté : dim. 26 juil. 2015 19:01
par orax
La question est un peu vague mais j'imagine que la boucle While bloque le script. Si c'est le cas, il y a cette page sur le wiki :
Interrupting a running function qui à l'air d'être en rapport avec ta demande.
Re: [..] Comment fermer un script qui tourne en boucle.
Posté : dim. 26 juil. 2015 19:19
par Boulanza
Merci TiDi,
Mon script ressemble à votre exemple, mais le boutant Exit est inactif lorsque le script tourne en boucle infini.
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$GUI = GUICreate("GUI", 200, 100, 200, 130)
$Bouton1 = GUICtrlCreateButton("Go", 5, 5, 190, 25)
$Bouton2 = GUICtrlCreateButton("Fermer", 5, 35, 190, 25)
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
Switch $msg
Case $Bouton1
[color=#0000FF]Mon script qui tourne en boucle infini.[/color]
Case $Bouton2
[color=#0000FF]Exit est inactif lorsque le script tourne en boucle infini.[/color]
EndSwitch
WEnd
Re: [..] Comment fermer un script qui tourne en boucle.
Posté : dim. 26 juil. 2015 20:36
par ZDS
Boujour Boulanza,
Ce que tu peux faire, c'est un garde fou :
► Afficher le texteCode avec fonction d'arrêt
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
[color=#00BB00]; Fonction d'arrêt en appuyant sur [F4], arrêt forcé en appuyant deux fois
Global $_stop = False
Func _stop()
If $_stop Then Exit
$_stop = True
EndFunc
HotKeySet("{F4}", "_stop")[/color]
$GUI = GUICreate("GUI", 200, 100, 200, 130)
$Bouton1 = GUICtrlCreateButton("Go", 5, 5, 190, 25)
$Bouton2 = GUICtrlCreateButton("Fermer", 5, 35, 190, 25)
GUISetState(@SW_SHOW)
[color=#00BB00]While Not $_stop[/color]
$msg = GUIGetMsg()
Switch $msg
Case $Bouton1
[color=#0000FF]Mon script qui tourne en boucle infini.[/color]
Case $Bouton2
[color=#0000FF]Exit est inactif lorsque le script tourne en boucle infini.[/color]
EndSwitch
WEnd
Et si tu souhaites conserver la possibilité de couper le programme avec un bouton et pas qu'avec un raccourci, il faut traiter son appui hors de la boucle While-WEnd :
► Afficher le texteCode avec fonction d'arrêt
Code : Tout sélectionner
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
[color=#00BB00]; Fonction d'arrêt en appuyant sur [F4], arrêt forcé en appuyant deux fois
Global $_stop = False
Func _stop()
If $_stop Then Exit
$_stop = True
EndFunc
HotKeySet("{F4}", "_stop")[/color]
$GUI = GUICreate("GUI", 200, 100, 200, 130)
$Bouton1 = GUICtrlCreateButton("Go", 5, 5, 190, 25)
[color=#00BB00]Global $Bouton2 = GUICtrlCreateButton("Fermer", 5, 35, 190, 25)[/color]
GUISetState(@SW_SHOW)
[color=#00BB00]; Fonction de gestion à la volée des commandes (supplante la boucle avec GUIGetMsg)
GUIRegisterMsg(0x0111, "command") ; $WM_COMMAND = 0x0111
Func command($handle, $msg, $param, $control)
Switch BitShift($param, 16)
Case 0 ; $BN_CLICKED = 0
Switch $control
Case GUICtrlGetHandle($Bouton2)
_stop()
Case Else
; Rien
EndSwitch
Case Else
; Rien
EndSwitch
Return "GUI_RUNDEFMSG" ; $GUI_RUNDEFMSG = "GUI_RUNDEFMSG"
EndFunc[/color]
[color=#00BB00]While Not $_stop[/color]
$msg = GUIGetMsg()
Switch $msg
Case $Bouton1
[color=#0000FF]Mon script qui tourne en boucle infini.[/color]
Case $Bouton2
[color=#0000FF]Exit est inactif lorsque le script tourne en boucle infini.[/color]
EndSwitch
WEnd
Attention, pour que la fonction command(...) sache à quel bouton elle a à faire, il faut que la variable de ton bouton $Bouton2 soit en global.
A bientôt !
PS: Il n'en reste pas moins que c'est une méthode qui est loin d'être propre. Ce qu'il faudrait c'est prévoir dans le code qui boucle une fonction d'arrêt, et pour cela il faudrait comme l'a demandé
mikell que tu nous postes le code qui boucle. Autant boucher une fuite plutôt que d'écoper.
Re: [..] Comment fermer un script qui tourne en boucle.
Posté : dim. 26 juil. 2015 20:45
par Boulanza
Merci infiniment ZDS pour la solution garde fou... c'est très clair comme explication.
Actuellement j'utilise la fonction:
; Touche echap pour quitter le script en cours.
HotKeySet("{ESC}", "Fin")
; Fonction de sortie du script.
Func Fin()
Exit
EndFunc
Mais je cherche une solution en cliquant sur le bouton "Quitter" pour arrêter l'application (script).
Cordialement.
Re: [..] Comment fermer un script qui tourne en boucle.
Posté : dim. 26 juil. 2015 23:58
par ZDS
ZDS a écrit :Et si tu souhaites conserver la possibilité de couper le programme avec un bouton et pas qu'avec un raccourci [...]
Le second code est exactement ce que tu veux, tu n'as pas dû lire tout mon message.
Mais je me répète,
couper le script en plein milieu de son exécution est une méthode à proscrire.
Envoie-nous le code qui boucle pour qu'on puisse t'aider à le terminer proprement.
Re: [..] Comment fermer un script qui tourne en boucle.
Posté : lun. 27 juil. 2015 01:28
par mikell
Ce qui n'est pas clair : qu'est-ce qui peut empêcher le bouton 'Quitter' de faire son boulot ?
Par exemple, si le bouton1
commande une fonction qui "tourne en boucle infinie" et que cette fonction contient elle-même une boucle While, à part une hotkey les seuls moyens qui marchent sont le mode événementiel ou le GuiRegisterMsg, comme l'ont déjà évoqué ZDS dans son message ou orax qui fournit le lien qui va bien dans
ce post
Il est donc nécessaire de savoir
exactement ce que commande le bouton1, autrement il est impossible de répondre à la question posée, auquel cas ce sujet n'a aucun intérêt donc il sera fermé (logique)
Le but de ce forum est d'aider les utilisateurs à résoudre un problème précis, pas de recopier toutes les solutions possibles mentionnées dans le fichier d'aide sur une question générique beaucoup trop vague
Non mais

Re: [..] Comment fermer un script qui tourne en boucle.
Posté : lun. 27 juil. 2015 11:20
par Boulanza
Bonjour tout le mande,
Oui Messieurs, vous avez raison, la solution 2 de ZDS est parfaite et universelle pour forcer la fermeture d'une application qui tourne en boucle infini.
je vous remercie pour votre aimable aide.
Cordialement.