[..] Sortir d'un For Next avec cette structure

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Anthony
Niveau 6
Niveau 6
Messages : 292
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

[..] Sortir d'un For Next avec cette structure

#1

Message par Anthony »

Bonjour à tous,

Voilà tout est dans le titre.
Pour être un peu plus précis ces 2 boucles For Next exécutent un travail différent très important en 2 étapes mais je dois pouvoir faire stop ou quitter sur les deux étapes de travail.
Là je sèche, çà parait simple mais j'aurais besoin d'une piste :mrgreen:
Merci ;)
#include <GuiConstants.au3>
;~ #include <GUIConstantsEx.au3>

Opt("GuiOnEventMode", 1)

Global $Stop

GUICreate("My GUI", 300, 200, Default, Default, -1, $WS_EX_ACCEPTFILES)
Global $Label  = GUICtrlCreateLabel("0", 10, 30, 150, 20)

Global $idBtn  = GUICtrlCreateButton("Start", 10, 50, 50, 20)
Global $idBtn2 = GUICtrlCreateButton("Stop", 10, 80, 50, 20)

GUICtrlSetOnEvent( $idBtn, "_Start")
GUICtrlSetOnEvent( $idBtn2, "_Stop")
GUISetOnEvent( $GUI_EVENT_CLOSE, "_Exit")

GUISetState()


While 1
   Sleep(100)
WEnd


Func _Start()
   ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Start()"& @CRLF)
   $Stop = 0
   _Working()
EndFunc

Func _Working()
   ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Working() Step 1/2"& @CRLF)
   For $i = 0 to 250
     If $Stop Then Exitloop
;~      If $Stop Then Return
     GuiCtrlSetData($Label, "Job 1 ligne " & $i)
     Sleep(10)
   Next
   ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Working() Step 2/2"& @CRLF)
   For $i = 0 to 250
     If $Stop Then Exitloop
;~      If $Stop Then Return
     GuiCtrlSetData($Label, "Job 2 ligne " & $i)
     Sleep(10)
   Next
   ConsoleWrite( "Line=" & @ScriptLineNumber & " Travail terminé"& @CRLF)
EndFunc

Func _Stop()   ; <<< Ne fonctionne pas pendant la boucle For Next
  ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Stop()"& @CRLF)
  $Stop = 1
EndFunc

Func _Exit()   ; <<< Ne fonctionne pas pendant la boucle For Next
   ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Exit()"& @CRLF)
   GUIDelete()
   Exit
EndFunc
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.

Mon UDF GuiStatusBar facile
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Sortir d'un For Next avec cette structure

#2

Message par walkson »

Bonjour,
Il y a peut être plus simple

Code : Tout sélectionner

#include <GuiConstants.au3>
;~ #include <GUIConstantsEx.au3>
#include <WinAPI.au3>
Opt("GuiOnEventMode", 1)

Global $Stop

GUICreate("My GUI", 300, 200, Default, Default, -1, $WS_EX_ACCEPTFILES)
Global $Label  = GUICtrlCreateLabel("0", 10, 30, 150, 20)

Global $idBtn  = GUICtrlCreateButton("Start", 10, 50, 50, 20)
Global $idBtn2 = GUICtrlCreateButton("Stop", 10, 80, 50, 20)

GUICtrlSetOnEvent( $idBtn, "_Start")
GUICtrlSetOnEvent( $idBtn2, "_Stop")
GUISetOnEvent( $GUI_EVENT_CLOSE, "_Exit")

GUISetState()
AdlibRegister("MyAdLibFunc",250)

While 1
   Sleep(100)
WEnd


Func _Start()
   ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Start()"& @CRLF)
   $Stop = 0
   _Working()
EndFunc

Func _Working()
   ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Working() Step 1/2"& @CRLF)
   For $i = 0 to 250
     If $Stop Then Exitloop
;~      If $Stop Then Return
     GuiCtrlSetData($Label, "Job 1 ligne " & $i)
     Sleep(10)
   Next
   ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Working() Step 2/2"& @CRLF)
   For $i = 0 to 250
     If $Stop Then Exitloop
;~      If $Stop Then Return
     GuiCtrlSetData($Label, "Job 2 ligne " & $i)
     Sleep(10)
   Next
   ConsoleWrite( "Line=" & @ScriptLineNumber & " Travail terminé"& @CRLF)
EndFunc

Func _Stop()   ; <<< Ne fonctionne pas pendant la boucle For Next
  ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Stop()"& @CRLF)
  $Stop = 1
EndFunc

Func _Exit()   ; <<< Ne fonctionne pas pendant la boucle For Next
   ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Exit()"& @CRLF)
   GUIDelete()
   Exit
EndFunc

Func MyAdLibFunc()
	$hWin = _WinAPI_GetFocus()
	$id = _WinAPI_GetDlgCtrlID($hWin)
	If $id = $idBtn2 And $Stop = 0 Then _Stop()
EndFunc
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
Anthony
Niveau 6
Niveau 6
Messages : 292
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

Re: [..] Sortir d'un For Next avec cette structure

#3

Message par Anthony »

Coucou walkson çà fait un petit bout ;)
On touche au but...
J'ai regardé la fonction Adlib que tu as rajouté et quand dans For Next (Ligne 35 $Stop = 0) $Stop reste à 1 dans Func MyAdLibFunc() (Ligne 74) ce qui ne permet pas de continuer le job 2
Adlib peut il récupérer la fonction pour quitter durant le Job 1 & 2 ?
#include <GuiConstants.au3>
#include <WinAPI.au3>
Opt("GuiOnEventMode", 1)

Global $Stop

GUICreate("My GUI", 300, 200, Default, Default, -1, $WS_EX_ACCEPTFILES)
Global $Label  = GUICtrlCreateLabel("0", 10, 30, 150, 20)

Global $idBtn  = GUICtrlCreateButton("Start", 10, 50, 50, 20)
Global $idBtn2 = GUICtrlCreateButton("Stop", 10, 80, 50, 20)

GUICtrlSetOnEvent( $idBtn, "_Start")
GUICtrlSetOnEvent( $idBtn2, "_Stop")
GUISetOnEvent( $GUI_EVENT_CLOSE, "_Exit")

GUISetState()
AdlibRegister("MyAdLibFunc",250)

While 1
   Sleep(100)
WEnd


Func _Start()
   ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Start()"& @CRLF)
   $Stop = 0
   _Working()
EndFunc

Func _Working()
   ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Working() Step 1/2"& @CRLF)
   For $i = 0 to 500
     If $Stop Then
       $Stop = 0
       ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Working() Step 1/2 $Stop="&$Stop& " $i"&$i& @CRLF)
       Exitloop
     EndIf
     GuiCtrlSetData($Label, "Job 1 ligne " & $i)
     Sleep(10)
   Next

   ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Working() Step 2/2"& @CRLF)
   For $i = 0 to 500
     If $Stop Then
       $Stop = 0
       ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Working() Step 2/2 $Stop="&$Stop& " $i"&$i& @CRLF)
       Exitloop
     EndIf
     GuiCtrlSetData($Label, "Job 2 ligne " & $i)
     Sleep(10)
   Next

   ConsoleWrite( "Line=" & @ScriptLineNumber & " Travail terminé"& @CRLF)
EndFunc

Func _Stop()   ; <<< Ne termine pas Job 2 pendant la boucle For Next
  ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Stop()"& @CRLF)
  $Stop = 1
EndFunc

Func _Exit()   ; <<< Ne fonctionne pas pendant les deux boucles For Next Job 1 & 2
   ConsoleWrite( "Line=" & @ScriptLineNumber & " @GUI_CtrlId=" &@GUI_CtrlId&" _Exit()"& @CRLF)
   GUIDelete()
   Exit
EndFunc

Func MyAdLibFunc()
   $hWin = _WinAPI_GetFocus()
   $id      = _WinAPI_GetDlgCtrlID($hWin)
   If $id = $idBtn2 And $Stop = 0 Then _Stop()
;~    ConsoleWrite( "Line=" & @ScriptLineNumber & " $hWin=" &$hWin& @CRLF)
;~    ConsoleWrite( "Line=" & @ScriptLineNumber & " @SEC=" &@SEC& @CRLF)
;~    ConsoleWrite( "Line=" & @ScriptLineNumber & " $Stop="&$Stop & @CRLF)
EndFunc
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.

Mon UDF GuiStatusBar facile
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Sortir d'un For Next avec cette structure

#4

Message par mikell »

IL faut remettre $stop à 0 avant la 2ème boucle, voyons ! :mrgreen:

Quoique, personnellement je préfère WM_COMMAND
Idem pour pouvoir fermer la gui pendant la boucle, ça serait avec WM_SYSCOMMAND, mais franchement j'en vois pô bien l'utilité...

#include <GuiConstants.au3>
#include <WindowsConstants.au3>

Global $stop = 0

GUICreate("My GUI", 300, 200);, Default, Default, -1, $WS_EX_ACCEPTFILES)
Global $Label  = GUICtrlCreateLabel("0", 10, 30, 150, 20)
Global $idBtn1  = GUICtrlCreateButton("Start", 10, 50, 50, 20)
Global $idBtn2 = GUICtrlCreateButton("Stop", 10, 80, 50, 20)
GUISetState()

GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")

While 1
    Switch GUIGetMsg()
         Case $GUI_EVENT_CLOSE
             _Exit()
         Case $idBtn1
             _Start()
     EndSwitch
WEnd


Func _Start()
   ConsoleWrite( "Line=" & @ScriptLineNumber & " _Start()"& @CRLF)
   $stop = 0
   _Working()
EndFunc

Func _Working()
   ConsoleWrite( "Line=" & @ScriptLineNumber & " _Working() Step 1/2"& @CRLF)
   For $i = 0 to 250
     If $stop Then Exitloop
     GuiCtrlSetData($Label, "Job 1 ligne " & $i)
     Sleep(10)
   Next
   ConsoleWrite( "Line=" & @ScriptLineNumber & " _Working() Step 2/2"& @CRLF)
   $stop = 0
   For $i = 0 to 250
     If $stop Then Exitloop
     GuiCtrlSetData($Label, "Job 2 ligne " & $i)
     Sleep(10)
   Next
   ConsoleWrite( "Line=" & @ScriptLineNumber & " Travail terminé"& @CRLF)
EndFunc

Func _Stop()  
  ConsoleWrite( "Line=" & @ScriptLineNumber & " _Stop()"& @CRLF)
  $Stop = 1
EndFunc

Func _Exit()   ; <<< Ne fonctionne pas pendant la boucle For Next
   ConsoleWrite( "Line=" & @ScriptLineNumber & " _Exit()"& @CRLF)
   GUIDelete()
   Exit
EndFunc

Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
   Switch BitAND($wParam, 0x0000FFFF) ; idfrom
   Case $idBtn2
      _Stop()
    EndSwitch
  Return 'GUI_RUNDEFMSG'
EndFunc
 
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Sortir d'un For Next avec cette structure

#5

Message par walkson »

Adlib peut il récupérer la fonction pour quitter durant le Job 1 & 2 ?
Le plus simple est de rajouter un bouton Exit et dans la fonction
If $id = $idBtn3 Then _Exit()
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Sortir d'un For Next avec cette structure

#6

Message par walkson »

Quoique, personnellement je préfère WM_COMMAND
Moi aussi mais il est en mode événementiel
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
Anthony
Niveau 6
Niveau 6
Messages : 292
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

Re: [..] Sortir d'un For Next avec cette structure

#7

Message par Anthony »

Merci tous les deux, je vais regarder çà avant de me coucher, bon appétit.
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.

Mon UDF GuiStatusBar facile
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Sortir d'un For Next avec cette structure

#8

Message par mikell »

walkson a écrit : dim. 04 sept. 2022 19:30
Quoique, personnellement je préfère WM_COMMAND
Moi aussi mais il est en mode événementiel
Je pensais qu'il utilisait le mode événementiel juste pour essayer de résoudre le problème
Mais le GUIRegisterMsg($WM_COMMAND,...) est tout à fait compatible avec ce mode aussi

#include <GuiConstants.au3>
#include <WindowsConstants.au3>

Opt("GuiOnEventMode", 1)
Global $stop = 0

GUICreate("My GUI", 300, 200, Default, Default, -1, $WS_EX_ACCEPTFILES)
Global $Label  = GUICtrlCreateLabel("0", 10, 30, 150, 20)
Global $idBtn1  = GUICtrlCreateButton("Start", 10, 50, 50, 20)
Global $idBtn2 = GUICtrlCreateButton("Stop", 10, 80, 50, 20)
GUISetState()

GUICtrlSetOnEvent( $idBtn1, "_Start")
GUISetOnEvent( $GUI_EVENT_CLOSE, "_Exit")

GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")

While 1
   Sleep(100)
WEnd


Func _Start()
   ConsoleWrite( "Line=" & @ScriptLineNumber & " _Start()"& @CRLF)
   $stop = 0
   _Working()
EndFunc

Func _Working()
   ConsoleWrite( "Line=" & @ScriptLineNumber & " _Working() Step 1/2"& @CRLF)
   For $i = 0 to 250
     If $stop Then
       ConsoleWrite( " _Working() Step 1 stoppé à $i = " & $i & @CRLF)
      Exitloop
   EndIf
     GuiCtrlSetData($Label, "Job 1 ligne " & $i)
     Sleep(10)
   Next
   ConsoleWrite( "Line=" & @ScriptLineNumber & " _Working() Step 2/2"& @CRLF)
   $stop = 0
   For $i = 0 to 250
     If $stop Then
       ConsoleWrite( " _Working() Step 2 stoppé à $i = " & $i & @CRLF)
      Exitloop
   EndIf
     GuiCtrlSetData($Label, "Job 2 ligne " & $i)
     Sleep(10)
   Next
   ConsoleWrite( "Line=" & @ScriptLineNumber & " Travail terminé"& @CRLF)
EndFunc

Func _Stop()  
  ConsoleWrite( "Line=" & @ScriptLineNumber & " _Stop()"& @CRLF)
  $Stop = 1
EndFunc

Func _Exit()   ; <<< Ne fonctionne pas pendant la boucle For Next
   ConsoleWrite( "Line=" & @ScriptLineNumber & " _Exit()"& @CRLF)
   GUIDelete()
   Exit
EndFunc

Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
   Switch BitAND($wParam, 0x0000FFFF) ; idfrom
   Case $idBtn2
      _Stop()
    EndSwitch
  Return 'GUI_RUNDEFMSG'
EndFunc
 
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre