Mehrere Adlibs gleichzeitig

  • Hallo @all,
    ich versuche gerade einen Matrix-Screensaver zu schreiben und brauche Hilfe:
    Am Anfang werden erstmal einige Labels mit Buchstaben bzw. Zahlen erstellt, dann sollen diese gleichzeitig geupdatet werden über mehrere Adlibs. Das klappt leider nicht, die Adlibs werden leider immer hintereinander ausgeführt, ich habe die AutoIt-Version 3.3.5.1. Beta. Was mache ich falsch?

    Hier der Quelltext:

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>

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

    Global $hWnd = GUICreate("Matrix Screensaver", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    Global $Breite = Round(Number(@DesktopWidth), -1)
    Global $Hoehe = Round(Number(@DesktopHeight), -1)
    Global $Labels[1]
    Global $String = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Global $Sleep1 = 1
    Global $Sleep2 = 10

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

    HotKeySet("{ESC}", "Ende")
    GUIRegisterMsg($WM_LBUTTONDOWN, "Ende")
    GUISetBkColor(0x000000)
    GUISetCursor(16)
    GUISetState()

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

    ;;;Labels erstellen
    For $i1 = 1 to $Breite Step 20
    For $i2 = 1 to $Hoehe Step 20
    $r1 = StringMid($String, Random(1, 62, 1) , 1)
    $Label = GUICtrlCreateLabel($r1, $i1, $i2)
    _ArrayAdd($Labels, $Label)
    GUICtrlSetColor(-1, 0x09FF00)
    ;Sleep(1)
    Next
    Next

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

    ;;;Die Adlibs
    ;;;Werden leider NICHT gleichzeitig ausgeführt
    AdlibRegister("a", 300)
    AdlibRegister("b", 300)
    AdlibRegister("c", 300)
    AdlibRegister("d", 300)
    AdlibRegister("e", 300)
    AdlibRegister("f", 300)
    AdlibRegister("g", 300)

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

    While True
    #cs
    For $i3 = 1 to UBound($Labels) - 2
    $r2 = StringMid($String, Random(1, 62, 1) , 1)
    GUICtrlSetData($Labels[$i3], $r2)
    Sleep($Sleep1)
    Next
    Sleep(10)
    #ce
    Sleep(100)
    WEnd

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

    ;;;Die Adlib-Funktionen
    Func a()
    For $counter = 1 to 43 Step 1
    $random = StringMid($String, Random(1, 62, 1) , 1)
    GUICtrlSetData($Labels[$counter], $random)
    Sleep(1)
    Next
    Sleep(10)
    EndFunc

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

    Func b()
    For $counter = 44 to 87 Step 1
    $random = StringMid($String, Random(1, 62, 1) , 1)
    GUICtrlSetData($Labels[$counter], $random)
    Sleep(1)
    Next
    Sleep(10)
    EndFunc

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

    Func c()
    For $counter = 88 to 131 Step 1
    $random = StringMid($String, Random(1, 62, 1) , 1)
    GUICtrlSetData($Labels[$counter], $random)
    Sleep(1)
    Next
    Sleep(10)
    EndFunc

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

    Func d()
    For $counter = 132 to 175 Step 1
    $random = StringMid($String, Random(1, 62, 1) , 1)
    GUICtrlSetData($Labels[$counter], $random)
    Sleep(1)
    Next
    Sleep(10)
    EndFunc

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

    Func e()
    For $counter = 176 to 219 Step 1
    $random = StringMid($String, Random(1, 62, 1) , 1)
    GUICtrlSetData($Labels[$counter], $random)
    Sleep(1)
    Next
    Sleep(10)
    EndFunc

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

    Func f()
    For $counter = 220 to 263 Step 1
    $random = StringMid($String, Random(1, 62, 1) , 1)
    GUICtrlSetData($Labels[$counter], $random)
    Sleep(1)
    Next
    Sleep(10)
    EndFunc

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

    Func g()
    For $counter = 264 to 307 Step 1
    $random = StringMid($String, Random(1, 62, 1) , 1)
    GUICtrlSetData($Labels[$counter], $random)
    Sleep(1)
    Next
    Sleep(10)
    EndFunc

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

    Func Ende()
    Exit
    AdlibUnRegister()
    EndFunc ;==>Ende

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

    Einmal editiert, zuletzt von xp_fan (1. Februar 2010 um 19:59)

  • Dann kann man zwar Adlibs gleichzeitig ausführen, aber die Funktionen werden trotzdem nacheinander ausgeführt ?(

    • Offizieller Beitrag

    Ja, genau!
    Du musst also Deine Funktionen so umschreiben, dass bei jedem Aufruf immer nur ein Schritt ausgeführt wird. Die For...Next-Schleife und die Sleeps raushauen.
    Genaugenommen brauchst Du auch nur eine Funktion, die Du mit AdlibRegister aufrufst. Dort veränderst Du dann für die Label jeweils einen Wert und beim nächsten Aufruf wird dann der nächste Schritt ausgeführt usw...

  • Mach es doch anders, führe 7x hintereinander GUICtrlSetData in einer AdLib aus, die du ale 100ms oder so starten lässt, Dann sieht es so aus das 7 Labels gleichzeitig befüllt werden.

    Edit: oder wie bei Oscar.

  • Aha, jetzt hab' ich's verstanden:Glühlampe:.
    Danke nochmal für das Beispiel.

    //Edit: @m-obi: So werd' ich's machen.