Skript weniger CPU-Lastig?

07/18/2011 06:31 Elborod#1
Tach


Ich hab für meinen Bot ein kleines Skript geschrieben, das immer wenn die 5te Maustaste gedrückt wird einen kurzen "send" Befehl ausführt. Das ganze is mir allerdings zu CPU Lastig geworden. Ging die CPU doch glatt auf 25% hoch nur wegen den paar Zeilen ;D

hat wer eine Idee?


PHP Code:
#NoTrayIcon

#include <Misc.au3>

$dll DllOpen("user32.dll")
TraySetState(2)

While 
1
    
If _IsPressed("05"$dllThen
            send
("{Enter}")
                
sleep(200)
            
send("{s}")
                
sleep(200)
            
send("{s}")
                
sleep(200)
            
send("{Enter}")
    EndIf
WEnd
DllClose
($dll


Allen die Ferien haben noch schöne Ferien :D

Grüße Stoani



PS.:
Die Zeiten zwischen den "sends" sind Fakten ;)
PS II.: Ich hab nicht Windows 95 installiert. i5 Prozessor Win7
07/18/2011 08:15 KDeluxe#2
While 1 → While Sleep(50)
07/18/2011 09:08 Elborod#3
Gute Idee Danke ;D
07/18/2011 22:42 Vierus.exe#4
Do
Until

Verwenden + Sleep :-)
07/18/2011 22:52 KDeluxe#5
Bei dieser Anwendung macht es im Endeffekt keinen Unterschied, ob ich die Endlosschleife mit
PHP Code:
Do
    ;...
    
    
Sleep(50)
Until False 
oder
PHP Code:
While Sleep(50)
    ;...
WEnd 
erzeugt wird.
07/19/2011 14:20 Vierus.exe#6
Hmm meines erachtens ist schon ein Unterschied zwischen Until oder While.
(Mal ganz abgesehen davon das ein ExitLoop bei Ihm Fehlt und das Skript endlos läuft woraus die hohe CPU last entsteht das Sleep verlangsamt ja nur die Read Inputzeit zum CPU)
While Läuft dauernd durch also dauernde CPU Last bei Until wird die Funktion nur Durchlaufen sollange die Variable Gesetzt ist.
Do
If $Keypress = _IsPressed("05", $dll) Then
;.....
Sleep(50)
Until $Keypress = 1

MfG
Vierus
07/19/2011 16:09 ~De@dly Silence~#7
Quote:
Originally Posted by Vierus.exe View Post
Do
If $Keypress = _IsPressed("05", $dll) Then
;.....
Sleep(50)
Until $Keypress = 1
Und dann muss er jedes mal, wenn die gewünschte Aktion durchgeführt wurde, das Script neu starten... Toll.
07/19/2011 18:17 meylan#8
ich würde es nicht mit einer _ispressed abfrage machen sondern direkt von der asynckeystate api holen dann fragt der nicht immer doppelt ab weil in der api bzw im event haendler wird das so oder so getan.

kleiner tipp lies dich hier mal durch

_WinAPI_GetAsyncKeyState()
07/19/2011 20:30 KDeluxe#9
Quote:
Originally Posted by Vierus.exe View Post
Hmm meines erachtens ist schon ein Unterschied zwischen Until oder While.
(Mal ganz abgesehen davon das ein ExitLoop bei Ihm Fehlt und das Skript endlos läuft woraus die hohe CPU last entsteht das Sleep verlangsamt ja nur die Read Inputzeit zum CPU)
While Läuft dauernd durch also dauernde CPU Last bei Until wird die Funktion nur Durchlaufen sollange die Variable Gesetzt ist.
Do
If $Keypress = _IsPressed("05", $dll) Then
;.....
Sleep(50)
Until $Keypress = 1

MfG
Vierus
Er beabsichtigt eine Dauerschleife, dein Beispiel trägt also nicht wirklich etwas bei, da es den Sinn nicht erfüllt. Er wollte nur eine Lösung für die relativ hohe CPU Belastung, das kann man nun mal mit einem simplen Sleep() lösen. Eine "Do... Until False" Schleife läuft außerdem ebenso endlos wie eine "While True" Schleife.


Quote:
Originally Posted by meylan View Post
ich würde es nicht mit einer _ispressed abfrage machen sondern direkt von der asynckeystate api holen dann fragt der nicht immer doppelt ab weil in der api bzw im event haendler wird das so oder so getan.

kleiner tipp lies dich hier mal durch

_WinAPI_GetAsyncKeyState()
Quote:
Originally Posted by Misc.au3
Code:
Func _IsPressed($sHexKey, $vDLL = 'user32.dll')
	Local $a_R = DllCall($vDLL, "short", "[COLOR="Red"][B]GetAsyncKeyState[/B][/COLOR]", "int", '0x' & $sHexKey)
	If @error Then Return SetError(@error, @extended, False)
	Return BitAND($a_R[0], 0x8000) <> 0
EndFunc   ;==>_IsPressed
Merkst du etwas?
07/19/2011 21:04 Elborod#10
Zerbrecht euch mal nicht weiter die Köpfe, die Lösung von Killer war einfach und korrekt.

Danke nochmals!



[CLOSED]