hi,
mir ist aufgefallen das in autoit geschriebene programme nur dann schnell laufen wenn ihr fenster aktiv ist und man die maus bewegt...
gibtes eine möglichkeit das zu umgehen das das programm immer auf maximaler geschwindigkeit läuft ?
Geschwindigkeits Bug ?
-
- [ gelöst ]
-
M☻x -
15. Februar 2011 um 19:42 -
Geschlossen -
Erledigt
-
-
Wie weist du das nach?
Mir ist dieses Verhalten noch nie aufgefallen.
Daher wäre ein Beispielcode zum nachvollziehen wichtig. -
hiho,
du könntest ja im Taskmanager von Windows die Priorität höher stellen. Dadurch sollte das Programm von Windows bevorzugt behandelt werden.
Edit:
Aber wie AspirinJunkie schon sagte, mir ist das auch noch nie aufgefallen. -
Douky
hilft leider nicht bin ich auch schon drauf gekommenAspirinJunkie
hier mein testcode ein kleines spiel "Game of Life"ps: zuerst die lebenden zellen zeichen dann start klicken
Spoiler anzeigen
[autoit]#include <ButtonConstants.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <Misc.au3>;Globals
[/autoit] [autoit][/autoit] [autoit]
Global $Ctrl = 0
Global $Zustand = 1
Global $Stopped = 1
Global $Color_Death = 0xdddddd
Global $Color_Live = 0xbb0000
Global $GameVar_X = 1
Global $GameVar_Y = 1Dim $Feld[105][105][10]
[/autoit] [autoit][/autoit] [autoit]#Region ### START Koda GUI section ### Form=
[/autoit] [autoit][/autoit] [autoit]
$Form0 = GUICreate("GoL", 308, 56)
$Label = GUICtrlCreateLabel("Spiel wird gestartet", 8, 8, 93, 17)
$Progress1 = GUICtrlCreateProgress(8, 24, 290, 25)
GUICtrlSetColor(-1, 0xFF00FF)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUISetState(@SW_SHOW,$Form0)
#EndRegion ### END Koda GUI section ####Region ### START Koda GUI section ### Form=
[/autoit] [autoit][/autoit] [autoit]
$Form1 = GUICreate("Test Map", 521, 581)
$Group1 = GUICtrlCreateGroup("", 8, 520, 505, 57)
$Button_Start = GUICtrlCreateButton("Start", 16, 536, 75, 33, $WS_GROUP)
$Button_Stop = GUICtrlCreateButton("Stop", 96, 536, 75, 33, $WS_GROUP)
;$Button3 = GUICtrlCreateButton("Button3", 176, 536, 75, 33, $WS_GROUP)
;$Button4 = GUICtrlCreateButton("Button4", 256, 536, 75, 33, $WS_GROUP)
;$Button5 = GUICtrlCreateButton("Button5", 336, 536, 75, 33, $WS_GROUP)
;$Button6 = GUICtrlCreateButton("Button6", 416, 536, 75, 33, $WS_GROUP)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISwitch($Form1)
GUISetState(@SW_HIDE,$Form1)
#EndRegion ### END Koda GUI section ###__CreateMap(100,99)
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_HIDE,$Form0)
GUISetState(@SW_SHOW,$Form1)While 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button_Start
$Stopped = 0
Case $Button_Stop
$Stopped = 1
EndSwitch;Game Loop
[/autoit] [autoit][/autoit] [autoit]
;---------------
If $Stopped = 1 Then
If _IsPressed("01") Then ;zeichnen
$Help_Ctrl = __MouseOver()
If GUICtrlRead($Help_Ctrl) = "0" Then
GUICtrlSetBkColor($Help_Ctrl, $Color_Live)
GUICtrlSetColor($Help_Ctrl, $Color_Live)
GUICtrlSetData($Help_Ctrl,"1")
EndIf
EndIf
If _IsPressed("02") Then ;löschen
$Help_Ctrl = __MouseOver()
If GUICtrlRead($Help_Ctrl) = "1" Then
GUICtrlSetBkColor($Help_Ctrl, $Color_Death)
GUICtrlSetColor($Help_Ctrl, $Color_Death)
GUICtrlSetData($Help_Ctrl,"0")
EndIf
EndIf
Else
If $GameVar_Y <= 99 Then
;------- Regeln ---------$z = __GetNachtbarCount($GameVar_X,$GameVar_Y)
[/autoit] [autoit][/autoit] [autoit]
If $z = 3 Then ;Neue Zelle
_ZellenStatus(1)
ElseIf $z < 2 Then ; Zelle Stirbt
_ZellenStatus(0)
ElseIf $z = 2 Or $z = 3 Then ;Zelle Bleibt
_ZellenStatus(2)
Else
_ZellenStatus(0) ;Zelle Stirbt
EndIf;------------------------
[/autoit] [autoit][/autoit] [autoit]
$GameVar_X += 1
If $GameVar_X = 99 Then
$GameVar_X = 1
$GameVar_Y += 1
EndIf
EndIf
If $GameVar_Y = 99 Then $GameVar_Y = 1
EndIf
;---------------
WEndFunc __CreateMap($xMax,$yMax)
[/autoit] [autoit][/autoit] [autoit]
;Pos Count
$x = 1
$y = 1
while $y <= $yMax
$Feld[$x][$y][$Ctrl] = GUICtrlCreateLabel("0", 10 + (($x - 1) * 5), 10 + (($y - 1) * 5), 5, 5)
GUICtrlSetColor(-1, $Color_Death)
GUICtrlSetBkColor(-1, $Color_Death)
$x += 1
If $x = $xMax Then
GUICtrlSetData($Progress1,$y)
$x = 1
$y += 1
EndIf
WEnd
GUICtrlSetData($Progress1,$y)
EndFuncFunc __MouseOver($GUI = "")
[/autoit] [autoit][/autoit] [autoit]
Local $x
$x = GUIGetCursorInfo($GUI)
If IsArray($x) = 1 Then Return $x[4]
If IsArray($x) = 0 Then
Return -1
SetError(1)
EndIf
EndFuncFunc __GetNachtbarCount($x,$y)
[/autoit] [autoit][/autoit] [autoit]
$Help = 0; +/+
[/autoit] [autoit][/autoit] [autoit]
If $x = 1 And $y = 1 Then
If GUICtrlRead($Feld[$x + 98][$y + 98][$Ctrl]) = "1" Then $Help += 1
ElseIf $x = 1 Then
If GUICtrlRead($Feld[$x + 98][$y - 1][$Ctrl]) = "1" Then $Help += 1
ElseIf $y = 1 Then
If GUICtrlRead($Feld[$x + 1][$y + 98][$Ctrl]) = "1" Then $Help += 1
Else
If GUICtrlRead($Feld[$x - 1][$y - 1][$Ctrl]) = "1" Then $Help += 1
EndIf; ./-
[/autoit] [autoit][/autoit] [autoit]
If $y - 1 > 0 Then
;kein umbruch
If GUICtrlRead($Feld[$x][$y -1][$Ctrl]) = "1" Then $Help += 1
Else
If GUICtrlRead($Feld[$x][$y + 98][$Ctrl]) = "1" Then $Help += 1
EndIf;+/-
[/autoit] [autoit][/autoit] [autoit]
If $x = 99 And $y = 1 Then
If GUICtrlRead($Feld[$x - 98][$y + 98][$Ctrl]) = "1" Then $Help += 1
ElseIf $x = 99 Then
If GUICtrlRead($Feld[$x - 98][$y - 1][$Ctrl]) = "1" Then $Help += 1
ElseIf $y = 1 Then
If GUICtrlRead($Feld[$x +1][$y +98][$Ctrl]) = "1" Then $Help += 1
Else
If GUICtrlRead($Feld[$x + 1][$y - 1][$Ctrl]) = "1" Then $Help += 1
EndIf;-/.
[/autoit] [autoit][/autoit] [autoit]
If $x = 1 Then
If GUICtrlRead($Feld[$x + 98][$y][$Ctrl]) = "1" Then $Help += 1
Else
If GUICtrlRead($Feld[$x - 1][$y][$Ctrl]) = "1" Then $Help += 1
EndIf;+/.
[/autoit] [autoit][/autoit] [autoit]
If $x = 99 Then
If GUICtrlRead($Feld[$x - 98][$y][$Ctrl]) = "1" Then $Help += 1
Else
If GUICtrlRead($Feld[$x + 1][$y][$Ctrl]) = "1" Then $Help += 1
EndIf;-/-
[/autoit] [autoit][/autoit] [autoit]
If $x = 1 And $y = 99 Then
If GUICtrlRead($Feld[$x + 98][$y - 98][$Ctrl]) = "1" Then $Help += 1
ElseIf $y = 99 Then
If GUICtrlRead($Feld[$x - 1][$y - 98][$Ctrl]) = "1" Then $Help += 1
ElseIf $x = 1 Then
If GUICtrlRead($Feld[$x + 98][$y + 1][$Ctrl]) = "1" Then $Help += 1
Else
If GUICtrlRead($Feld[$x - 1][$y + 1][$Ctrl]) = "1" Then $Help += 1
EndIfIf $y = 99 Then
[/autoit] [autoit][/autoit] [autoit]
If GUICtrlRead($Feld[$x][$y - 98][$Ctrl]) = "1" Then $Help += 1
Else
If GUICtrlRead($Feld[$x][$y + 1][$Ctrl]) = "1" Then $Help += 1
EndIfIf $x = 99 And $y = 99 Then
[/autoit] [autoit][/autoit] [autoit]
If GUICtrlRead($Feld[$x - 98][$y - 98][$Ctrl]) = "1" Then $Help += 1
ElseIf $x = 99 Then
If GUICtrlRead($Feld[$x - 98][$y + 1][$Ctrl]) = "1" Then $Help += 1
ElseIf $y = 99 Then
If GUICtrlRead($Feld[$x + 1][$y - 98][$Ctrl]) = "1" Then $Help += 1
Else
If GUICtrlRead($Feld[$x + 1][$y + 1][$Ctrl]) = "1" Then $Help += 1
EndIfReturn $Help
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFuncFunc _ZellenStatus($c)
[/autoit]
If $c = 0 Then
GUICtrlSetBkColor($Feld[$GameVar_X][$GameVar_Y][$Ctrl], $Color_Death)
GUICtrlSetColor($Feld[$GameVar_X][$GameVar_Y][$Ctrl], $Color_Death)
GUICtrlSetData($Feld[$GameVar_X][$GameVar_Y][$Ctrl],"0")
EndIf
If $c = 1 Then
GUICtrlSetBkColor($Feld[$GameVar_X][$GameVar_Y][$Ctrl], $Color_Live)
GUICtrlSetColor($Feld[$GameVar_X][$GameVar_Y][$Ctrl], $Color_Live)
GUICtrlSetData($Feld[$GameVar_X][$GameVar_Y][$Ctrl],"1")
EndIf
EndFunc -
- Offizieller Beitrag
Das Problem liegt am MessageLoopModus. Siehe auch hier:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
$hGui = GUICreate('Test (MessageLoopMode)')
$hCounter = GUICtrlCreateLabel(0, 10, 10, 100, 20)
GUISetState()
Do
GUICtrlSetData($hCounter, GUICtrlRead($hCounter) + 1)
Until GUIGetMsg() = -3
GUIDelete($hGui)Opt('GUIOnEventMode', 1)
[/autoit] [autoit][/autoit] [autoit]
$hGui = GUICreate('Test (OnEventMode)')
GUISetOnEvent(-3, '_End')
$hCounter = GUICtrlCreateLabel(0, 10, 10, 100, 20)
GUISetState()
Do
GUICtrlSetData($hCounter, GUICtrlRead($hCounter) + 1)
Until 0Func _End()
[/autoit]
Exit
EndFunc
Beim ersten Beispiel wird schneller gezählt, wenn die Maus bewegt wird. Das liegt an der dynamischen Prozessorauslastung im MessageLoopModus. -
vielen dank , hatte das problem schon öfters jetzt bin ich froh das ich doch mal gefragt hab
-
- Offizieller Beitrag
Genaugenommen ist das kein Fehler von AutoIt, sondern des Programmierers.
Im Ernst: solche Berechnungen sollten sich nicht in der MessageLoop-Schleife befinden. Am besten in eine Funktion packen und diese mit AdlibRegister aufrufen, dann hast Du das Problem nicht. -
mir war der unterschied bis jetzt nicht bewusst obwohl es wenn ich so drüber nachdenke logisch ist.
