Brauche Hilfe .. threading

07/18/2012 00:00 Shishidump#1
Hey leute,
ich breuchte ein bisschen Hilfe..
Ich versuche einen Bot zu schreiben bin auch eig. recht weit.
Ich kann die HP / MP auslesen und sowas und auch verarbeiten nur möchte ich das der Bot immer dabei S drückt.

Also ich lade mal ein paar Code-schnipsel hoch.
Code :

Code:
If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then
				Sleep(500)
				If WinActive("Hero OnLine") Then
					Send("s")
				ElseIf WinActive("Hero OnLine Bot") Then
					While 1
						Sleep(200)
					WEnd
				EndIf
			EndIf

			If GUICtrlRead($Checkbox2) = $GUI_CHECKED Then
				If $HPHave < $HPM - GUICtrlRead($Input1) Then
					WinActivate("Hero OnLine")
					If WinActive("Hero OnLine") Then
						Send("0")
					EndIf
				EndIf

				If $MPHave < $MPM - GUICtrlRead($Input2) Then
					WinActivate("Hero OnLine")
					If WinActive("Hero OnLine") Then
						Send("9")
					EndIf
				EndIf
			EndIf

Wisst ihr was ich meine ?
Wenn der nähmlich jetzt das so macht dann klickt er nicht schnell genug die Pot Knöpfe..


Mfg
07/18/2012 00:58 lolkop#2
Quote:
Originally Posted by Shishidump View Post
Code:
If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then
				Sleep(500)
				If WinActive("Hero OnLine") Then
					Send("s")
				ElseIf WinActive("Hero OnLine Bot") Then
					While 1
						Sleep(200)
					WEnd
				EndIf
			EndIf

			If GUICtrlRead($Checkbox2) = $GUI_CHECKED Then
				If $HPHave < $HPM - GUICtrlRead($Input1) Then
					WinActivate("Hero OnLine")
					If WinActive("Hero OnLine") Then
						Send("0")
					EndIf
				EndIf

				If $MPHave < $MPM - GUICtrlRead($Input2) Then
					WinActivate("Hero OnLine")
					If WinActive("Hero OnLine") Then
						Send("9")
					EndIf
				EndIf
			EndIf
was sollen die winActivates dazwischen? sowas kannst du getrost weglassen. ist der client active, so soll die aktion ausgeführt werden, ist das nicht der fall, so lässt der bot es halt =)

abgesehen davon musst du dich von sleeps verabschieden. diese blockieren lediglich dein restscript.

Edit:
zumal
Code:
[...]
ElseIf WinActive("Hero OnLine Bot") Then
    While 1
        Sleep(200)
    WEnd
EndIf
[...]
in einer endlosschleife endet, und somit dein script komplett blockiert.
07/18/2012 01:24 Shishidump#3
Danke für deine Antwort aber es löst ja nicht direkt mein Problem..
07/18/2012 14:12 lolkop#4
eigentlich schon. angenommen ein befehl braucht auf deiner maschiene 0,0003 millisekunden zur ausführung.

nun kommt dein "sleep(500)" dazwischen. dieses verhindert während seiner ausführung, die ausführung von ca. 1.666.667 (500/0,0003) anderen befehlen...

somit blockiert es quasi dein gesamtes script, und macht alles sehr "träge".

deshalb erwähne ich es nochmals... willst du ein vernünftiges script schreiben, musst du dich von dem sleep befehl komplett trennen.
07/18/2012 15:44 Shishidump#5
Was soll ich denn anstatt sleep nehmen?
07/18/2012 16:57 lolkop#6
Quote:
Originally Posted by Shishidump View Post
Was soll ich denn anstatt sleep nehmen?
hierfür gibt es timer...

Code:
While True
	Send(3)
	Sleep(500)
WEnd
ist zum beispiel durch einen timer so realisierbar.
Code:
Dim $timer
While True
	If TimerDiff($timer) >= 500 Then
		Send(3)
		$timer = TimerInit()
	EndIf
WEnd
den vorteil solltest du selbst erkennen, wenn du ununterbrochen eine 2 senden willst, aber nur alle 500ms eine 3...

durch eine timer abfrage wird der rest deines scriptes nicht blockiert, wie durch sleep befehle.
07/18/2012 21:25 Shishidump#7
Danke !
Das war das Problem.

Nun hab ich noch ein Problem :D

Habe 2 Button die mit einem Event verknüpft sind.
Code:
$Button1 = GUICtrlCreateButton("Start", 152, 128, 75, 25)
GUICtrlSetOnEvent(-1, "StartPressed")
$Button2 = GUICtrlCreateButton("Stop", 152, 160, 75, 25)
GUICtrlSetOnEvent(-1, "StopPressed")
Ich wollte das Script durch eine Variable stoppen lassen.

So damit er halt normal läuft wenn Stop Null ist.
Code:
Func StartPressed()

	While 1
		If $Stop = 0 Then
Hier was er machen soll wenn Stop nicht Null ist.
Code:
Else
			Dim $timer1
			While True
				If TimerDiff($timer1) >= 500 Then
					$timer1 = TimerInit()
				EndIf
			WEnd
		EndIf
	WEnd


EndFunc   ;==>StartPressed

Und das Event für den Stop Button.
Code:
Func StopPressed()

	$Stop = 1

EndFunc   ;==>StopPressed


Aber das will nicht so ganz..
07/18/2012 22:14 lolkop#8
Quote:
Originally Posted by Shishidump View Post
Ich wollte das Script durch eine Variable stoppen lassen.

So damit er halt normal läuft wenn Stop Null ist.
die idee ist schonmal sehr gut =)

du solltest dabei aber bedenken, das ein script immer zeile für zeile abgearbeitet wird. um sicher zu gehen, das alle deine code-zeilen immer erreichbar sind, solltest du nach möglichkeit die gesamte logik in einer endlosschleife unterbringen.

du hast dich ja für ein gui mit der "on-event" variante entschieden, was an sich schonmal deutlich einfacher ist, als über GuiGetMsg ständig alles abzufragen.

allerdings solltest du dir einen anderen script aufbau angewöhnen. hier mal schemenhaft kurz erklärt:
Code:
Dim $stop = True

GuiCreate(...)
GuiCtrlCreateButton("Start", ...)
GuiCtrlSetOnEvent(-1, "Start")
GuiCtrlCreateButton("Stop", ...)
GuiCtrlSetOnEvent(-1, "Stop")
[...]
GuiSetState()

While True
    If Not $stop Then
        [...]
    EndIf
WEnd

Func Start()
    $stop = False
EndFunc

Func Stop()
    $stop = True
EndFunc
so hast du eine "hauptschleife", in der dein ganzes script abläuft.
die buttons an sich ändern lediglich zustände, welche in deiner "hauptschleife" abgearbeitet werden =)
07/18/2012 23:21 Shishidump#9
Ahhh
Danke!
Du bringst mir ganz schön viel bei :D Danke ! :D