Hilfe bei einer Schleife (Pausierung)

04/30/2015 00:26 Howa2000#1
Hallo Leute,

ich bin ein ziemlicher Anfänger, - möchte aber direkt sagen, ich muss kein Profi werden. Ich habe mir für die Uni ein kleines "Lesetool" gebaut, doch leider hat es ein Problem :

Wenn ich das sleep länger als 3000 mache, kann ich das Program nicht mehr stoppen. Scheinbar hängt es dann im Sleepmodus fest. Mit sleep 100 kann ich es stoppen, aber das ist zu kurz zum lesen :-( (Später möchte ich mit iniread iniwrite noch den "sleep" über das Menü eingeben (je nach Textlänge - das ist aber dann die nächste Baustelle. Hilfe brauche ich bei dem Sleep eben...) Ich habe mal was mit einem Timer statt Sleep gelesen, doch nach 2-3 Stunden probieren, frage ich nun doch nach Hife.

Ich freue mich über eine Lösung. Hier der Code:


Code:
While 1

	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			If $schleife = 0 Then
				AdlibRegister("schleife", 200)
				GUICtrlSetData($Button1, "Stop")
				$schleife = 1
			Else
				AdlibUnRegister()
				GUICtrlSetData($Button1, "Blättern")
				$schleife = 0
			EndIf
	EndSwitch

WEnd


Func schleife()

ControlClick($hwnd, "", "", "left",1, Random(10,25), Random(325,370)) ;Öffnechat
sleep(100)



ControlClick($hwnd, "", "", "left",1, Random(339,355), Random(325,370)) ;Öffnechat

EndFunc   ;==>schleife
04/30/2015 00:52 Moneypulation#2
1. Ich kenne mich nicht besonders mit Adlib aus aber dein 200ms Timer könnte das Problem sein. Wenn du z.B. einen Sleep mit 500ms in der Funktion einbaust, wird ja schon bereits nach 200ms die Funktion wieder aufgerufen bevor die erste beendet wurde. In der [Only registered and activated users can see links. Click Here To Register...] wird ja auch in der Adlibfunktion geschrieben:
Quote:
;... die Ausführung darf nicht blockiert werden. Die Verwendung der ...Wait(), MsgBox(), InputBox() Funktionen ist daher zu vermeiden.
Ich könnte mich aber auch irren, kenne mich wie gesagt damit nicht besonders aus
2. Timer sind ganz einfach. Mit $Timer1 = TimerInit() initialisierst du einen Timer. Mit $ZeitVergangen = TimerDiff($Timer1) findest du heraus wie viele Millisekunden in der Zeit vom initialisieren vergangen sind. Beispiel:


$Timer1 = TimerInit()
Sleep(3000)
$ZeitVergangen = TimerDiff($Timer1)
Msgbox(0,"Zeit vergangen",$ZeitVergangen)

; Er wird dir ~3000 ausgeben

Mit $Timer1 = TimerInit() kannst du den Timer wieder auf Null setzen, sodass er wieder neu anfängt zu zählen. Mit Timern kann man so ein Zeitproblem gut und einfach lösen, nur verstehe ich nicht ganz was du mit deinem "Lesetool" meinst und was er genau macht. Hoffe ich hab dir etwas weitergeholfen
04/30/2015 01:16 Howa2000#3
Vielen Dank für deine Antwort. Leider blockiert er mit dem Timer auch den Abbruch via Buttom :(


Ich habe einen anderen Weg probiert, jedoch habe ich da keine Ahnung wie ich die Iniwrite einbinde :/ Jetzt geht das mit dem Timer bzw dem langen Sleep aber eben nicht der iniwrite.. grübel


Quote:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt('GUIOnEventMode', 1)
$hWnd = WinGetHandle("Windows Fotoanzeige")
Global $modus = False
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1_1_1 = GUICreate("Blatterer", 186, 107, 321, 314)
GUISetBkColor(0xABABAB)
$Start = GUICtrlCreateButton("Start", 11, 5, 81, 33)
$Stop = GUICtrlCreateButton("Stop", 92, 5, 81, 33)
$bis = GUICtrlCreateInput("3000", 53, 42, 37, 21)
$speichern = GUICtrlCreateButton("Übernehmen", 92, 40, 81, 25)
$von = GUICtrlCreateInput("2000", 12, 42, 37, 21)
$beschreibung = GUICtrlCreateButton("Beschreibung", 13, 72, 153, 25) ; Hier soll ein Popup aufgehen, wo ich eine kleine Erklärung mitteilen möchte. (Text)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


#cs Ich Schaffe es nicht diese Funktion einzubringen bzw das Program scheint dann in dieser Funktion hängen zu bleiben

Dim $ini = @ScriptDir & "\Config.ini"
Dim $AngabeVON = IniRead ("Config.ini", "Benutzerdaten", "von", GUICtrlRead($von))
Dim $AngabeBIS = IniRead ("Config.ini", "Benutzerdaten", "bis", GUICtrlRead($bis))
$nMsg = GUIGetMsg()
Switch $nMsg

Case $speichern
IniWrite("Config.ini", "Benutzerdaten", "von", GUICtrlRead($von))
IniWrite("Config.ini", "Benutzerdaten", "bis", GUICtrlRead($bis))

Case $GUI_EVENT_CLOSE
Exit
EndSwitch
#ce


GUICtrlSetOnEvent($Start, '_start')
GUICtrlSetOnEvent($Stop, '_stop')
GUISetOnEvent($GUI_EVENT_CLOSE, '_exit')

While Sleep(10)
If $modus = True Then
$hWnd = WinGetHandle("BlueStacks App Player")
ControlClick($hwnd, "", "", "left",1, Random(10,25), Random(325,370))
Sleep(Random(1000,2000))
;;;;;;;;;;;; Hier sollte eigentlich dann $AngabeVON,$AngabeBIS stehen....
ControlClick($hwnd, "", "", "left",1, Random(339,355), Random(325,370))
Sleep(Random(1000,3000))
EndIf

WEnd
Func _exit()
Exit

EndFunc
Func _start()
$modus = True
EndFunc

Func _stop()
$modus = False
EndFunc
04/30/2015 19:47 Moneypulation#4
Quote:
$nMsg = GUIGetMsg()
Switch $nMsg

Case $speichern
IniWrite("Config.ini", "Benutzerdaten", "von", GUICtrlRead($von))
IniWrite("Config.ini", "Benutzerdaten", "bis", GUICtrlRead($bis))

Case $GUI_EVENT_CLOSE
Exit
EndSwitch
Dieser Code funktioniert nicht, da ein Switch keine Schleife ist. Das heißt der Code wird nur 1x durchgelaufen, also reagiert dein Script nicht auf Buttons. Der Switch muss in einer Endlosschleife sein, wie z.B. in deiner While Sleep(10) Schleife.
05/01/2015 16:07 Howa2000#5
Vielen Dank für deine erneute Antwort :-)

Nun wenn ich es in die Schlaufe mache, dann lässt es sich nicht stoppen bzw er schreibt es n die Ini, ich kann danach aber die andere Funktion nicht mehr starten. Scheinabar macht er mit dem Buttom dann eine Endlosschlaufe mit dem Eintrag. Wie stelle ich es ein, dass er es nur einmal machen soll?

Habe wieder einige Stunden versucht aber ohne Erfolg... huihuihui
05/01/2015 16:46 Moneypulation#6
Quote:
Originally Posted by Howa2000 View Post
Vielen Dank für deine erneute Antwort :-)

Nun wenn ich es in die Schlaufe mache, dann lässt es sich nicht stoppen bzw er schreibt es n die Ini, ich kann danach aber die andere Funktion nicht mehr starten. Scheinabar macht er mit dem Buttom dann eine Endlosschlaufe mit dem Eintrag. Wie stelle ich es ein, dass er es nur einmal machen soll?

Habe
wieder einige Stunden versucht aber ohne Erfolg... huihuihui
Poste mal deinen code
05/01/2015 19:58 Howa2000#7
Immer noch der letze den ich gepostet habe. Ich versuche immer was, dann gehts nicht und zurück zum start.
05/02/2015 00:38 Moneypulation#8
Quote:
Opt("GUIOnEventMode",1)
Das war das Problem. Wenn du den Modus aktivierst, musst du den anscheinend auch einbehalten. Das heißt, du kannst Funktionen per Buttonklick nur noch so ausführen:

GUICtrlSetOnEvent($Start, '_start')

und nicht mehr in einer GUIGetMsg()-Schleife

05/02/2015 13:28 Howa2000#9
Du bist echt Klasse! Werde es später direkt Testen! Vielen Dank! :mofo: umademyday :):):):):):):):):):):)