Autoit Schleife beenden

07/24/2015 21:39 AndyDe#1
Ich habe folgendes Problem ich habe eine Func und die wird immer wiederholt nun möchte ich, das ich die mit meinen Stop Button unterbrechen kann.


Code:
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case -3
			Exit
		Case $start
				For $iL = 1 To GUICtrlRead($hinputanzahl) Step +1
				GUICtrlSetData($hEdit, "Runde: " & $iL & " von " &GUICtrlRead($hinputanzahl))
				ELBot()
				Next
		Case $Stop

	EndSwitch

WEnd
07/24/2015 22:06 BladeTiger12#2
Benutze AdlibRegister. Damit kann man das ganz einfach lösen mein Lieber Andy :)
Habs dir ja auch schon in Skype gesagt, aber anscheinend möchtest du das nicht nutzen :(.
07/25/2015 02:57 Moneypulation#3
Falls du die ELBot() Funktion meinst, kannst du zum einen dein Script pausieren und die Funktion so unterbrechen, oder du lässt die Funktion durchlaufen, ohne dass sie etwas macht.

1.

HotKeySet("1","pausieren")

Global $Paused = False

Func pausieren()
$Paused = Not $Paused
While $Paused
Sleep(500)
WEnd
EndFunc

2.

HotKeySet("1","changeValue")

Global $Value = True

Func ELBot()
If $Value Then
...
...
...
EndIf
EndFunc

Func changeValue()
$Value = Not $Value
EndFunc

Das wären meine beiden Vorschläge
07/25/2015 18:20 lolkop#4
Quote:
Originally Posted by AndyDe View Post
Ich habe folgendes Problem ich habe eine Func und die wird immer wiederholt nun möchte ich, das ich die mit meinen Stop Button unterbrechen kann.
Du kannst dir einfach einen Zustand definieren, welchen du über Buttons ändern kannst:
Code:
Dim $run
While True
   Switch GUIGetMsg()
	  Case -3
		 Exit
	  Case $start, $stop
		 $run = Not $run
   EndSwitch
   If $run Then
	  For $iL = 1 To GUICtrlRead($hinputanzahl) Step +1
		 GUICtrlSetData($hEdit, "Runde: " & $iL & " von " &GUICtrlRead($hinputanzahl))
		 ELBot()
	  Next
   EndIf
WEnd
Je nachdem, welchen Zustand deine Variable dann hat, werden Aktionen ausgeführt oder auch nicht.

Natürlich bräuchtest du so auch nur einen Button.
07/25/2015 20:14 warfley#5
Also ich habe mit Autoit nicht sehr viel am hut würde es aber prinzipiell so machen dass die Schleife Ausgeführt wird während die form Idled, also den Loop in den Messageloop integrieren:
Code:
 $iL = -1
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case -3
			Exit
		Case $start
                  $iL = 1
		Case $Stop
                  $iL = -1

	EndSwitch
        if $iL > 0 and $iL < GUICtrlRead($hinputanzahl) then
          //Do Your Shit here
          $iL = $iL + 1
        endif

WEnd
07/25/2015 20:24 lolkop#6
Quote:
Originally Posted by warfley View Post
Also ich habe mit Autoit nicht sehr viel am hut würde es aber prinzipiell so machen dass die Schleife Ausgeführt wird während die form Idled, also den Loop in den Messageloop integrieren
Das ist natürlich die sauberere Lösung =)
Hatte mir das was da im Hintergrund passieren soll, garnicht näher angeschaut =P
07/25/2015 20:25 alpines#7
Quote:
Originally Posted by warfley View Post
Also ich habe mit Autoit nicht sehr viel am hut würde es aber prinzipiell so machen dass die Schleife Ausgeführt wird während die form Idled, also den Loop in den Messageloop integrieren:
Das Problem hier ist aber wenn da zeitintensive Aufgaben drinne erledigt werden. Wenn es einfache GUICtrlSetDatas oder ähliche Sachen sind ist das ja kein Problem aber wenn es WebRequests sind und die mal einen TimeOut kriegen, dann hängt die ganze Form.

Da würde ich doch lieber auf OnEventMode setzen und wenigstens den GUIThread separat laufen lassen.
07/25/2015 21:38 lolkop#8
Quote:
Originally Posted by alpines View Post
Das Problem hier ist aber wenn da zeitintensive Aufgaben drinne erledigt werden. Wenn es einfache GUICtrlSetDatas oder ähliche Sachen sind ist das ja kein Problem aber wenn es WebRequests sind und die mal einen TimeOut kriegen, dann hängt die ganze Form.

Da würde ich doch lieber auf OnEventMode setzen und wenigstens den GUIThread separat laufen lassen.
Auch TCP bzw. UDP sollte kein Porblem darstellen. Request senden und in der Main-Loop auf vollständige Antwort warten =)

Die GUI kann nebnbei problemlos, fleißig weiter mit abgefragt werden.

Edit:
Hier ist ein Video zu einem Bot für ein flashbasiertes Onlinespiel, welchen ich vor geraumer Zeit mal geschrieben habe:

Im GUI wurden pro Sekunde über 300 Einträge aktualisiert und die Pakete flossen ganz normal im Hintergrund. Für derartige Aufgaben ist weder Multithreading, noch ein Eventbasiertes GUI notwendig =)