Geschwindigkeits Bug ?

  • 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 ?

    Einmal editiert, zuletzt von M☻x (15. Februar 2011 um 20:00)

  • Douky
    hilft leider nicht bin ich auch schon drauf gekommen

    AspirinJunkie
    hier mein testcode ein kleines spiel "Game of Life"

    ps: zuerst die lebenden zellen zeichen dann start klicken

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Include <Misc.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Globals
    Global $Ctrl = 0
    Global $Zustand = 1
    Global $Stopped = 1
    Global $Color_Death = 0xdddddd
    Global $Color_Live = 0xbb0000
    Global $GameVar_X = 1
    Global $GameVar_Y = 1

    [/autoit] [autoit][/autoit] [autoit]

    Dim $Feld[105][105][10]

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $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 ###

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $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 ###

    [/autoit] [autoit][/autoit] [autoit]

    __CreateMap(100,99)
    GUISetState(@SW_HIDE,$Form0)
    GUISetState(@SW_SHOW,$Form1)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button_Start
    $Stopped = 0
    Case $Button_Stop
    $Stopped = 1
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Game Loop
    ;---------------
    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 ---------

    [/autoit] [autoit][/autoit] [autoit]

    $z = __GetNachtbarCount($GameVar_X,$GameVar_Y)
    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
    ;---------------
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func __CreateMap($xMax,$yMax)
    ;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)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func __MouseOver($GUI = "")
    Local $x
    $x = GUIGetCursorInfo($GUI)
    If IsArray($x) = 1 Then Return $x[4]
    If IsArray($x) = 0 Then
    Return -1
    SetError(1)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func __GetNachtbarCount($x,$y)
    $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
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $y = 99 Then
    If GUICtrlRead($Feld[$x][$y - 98][$Ctrl]) = "1" Then $Help += 1
    Else
    If GUICtrlRead($Feld[$x][$y + 1][$Ctrl]) = "1" Then $Help += 1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $x = 99 And $y = 99 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 = 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
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $Help
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ZellenStatus($c)
    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

    [/autoit]
    • Offizieller Beitrag

    Das Problem liegt am MessageLoopModus. Siehe auch hier:

    Spoiler anzeigen
    [autoit]


    $hGui = GUICreate('Test (MessageLoopMode)')
    $hCounter = GUICtrlCreateLabel(0, 10, 10, 100, 20)
    GUISetState()
    Do
    GUICtrlSetData($hCounter, GUICtrlRead($hCounter) + 1)
    Until GUIGetMsg() = -3
    GUIDelete($hGui)

    [/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 1)
    $hGui = GUICreate('Test (OnEventMode)')
    GUISetOnEvent(-3, '_End')
    $hCounter = GUICtrlCreateLabel(0, 10, 10, 100, 20)
    GUISetState()
    Do
    GUICtrlSetData($hCounter, GUICtrlRead($hCounter) + 1)
    Until 0

    [/autoit] [autoit][/autoit] [autoit]

    Func _End()
    Exit
    EndFunc

    [/autoit]


    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

  • mir war der unterschied bis jetzt nicht bewusst obwohl es wenn ich so drüber nachdenke logisch ist. :whistling: