Page 1 sur 1

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

Posté : dim. 04 sept. 2022 14:37
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

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

Posté : dim. 04 sept. 2022 17:02
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

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

Posté : dim. 04 sept. 2022 18:11
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

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

Posté : dim. 04 sept. 2022 18:30
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
 

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

Posté : dim. 04 sept. 2022 19:26
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()

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

Posté : dim. 04 sept. 2022 19:30
par walkson
Quoique, personnellement je préfère WM_COMMAND
Moi aussi mais il est en mode événementiel

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

Posté : dim. 04 sept. 2022 20:38
par Anthony
Merci tous les deux, je vais regarder çà avant de me coucher, bon appétit.

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

Posté : lun. 05 sept. 2022 08:06
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