AdlibEnable() funktioniert nicht wie es soll...

  • [autoit]

    Run("notepad.exe")
    WinWait("Unbenannt")

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

    AdlibEnable("myadlib")

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

    while 1
    sleep(2000)
    send(1)

    WEnd

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

    Func myadlib()
    sleep(1750)
    send(2)
    EndFunc

    [/autoit]

    habe dieses kleine Programm mal zum Probieren geschrieben.... leider wird immer nur "222222222222222222222" gedrückt. Ich hätte aber gern das er 2121212121. Das er praktisch multitreating betreibt. Er ist gleichzeitig in der while schleife die die 1 er ausgibt und gleichzeitig euch in der func wo er die 2 er ausgibt...

  • Adlib hat einen Parameter für die Zeitangabe, sonst wird das eben alle 10ms aufgerufen und schreibt dann 2

    Spoiler anzeigen
    [autoit]

    Run("notepad.exe")
    WinWait("Unbenannt")

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

    AdlibEnable("myadlib",2000)
    Sleep(500)
    while 1
    sleep(2000)
    send(1)

    WEnd

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

    Func myadlib()
    ;~ sleep(1750) ;HIER KEIN SLEEp!!!
    send(2)
    EndFunc

    [/autoit]
  • danke für die antworten, das mit der Zeit hab ich selber schon gelesen wollte es aber zu Testzwecken mal so lassen...

    Ich habe das schon verstanden das wenn das sleep in der while schleife länger ist wie Wiederholungszeit von
    AdlibEnable das er dann nur in der die AdlibEnable abarbeitet und nie in die zum send(1) kommt..

    Es haben aber schon mehre Leute das gleiche Problem wie ich das man einfach 2 Sachen gleichzeitig abarbeitet werden sollen.... mulitreating eben... man kann so was mit timer speudo mässig bauen das ist mir klar aber ich will echtes multitreating..

    z.b alle 250ms nen 2er und jede Sekunde nen 1 er, adlib soll gleichzeitig mit dem Hauptprogramm ausgeführt werden und nicht mal das mal das. Wie als wären 2 verschiedene autoitscripte in einem wo das eine immer die 2 er drückt und das andere immer die 1 er

    222212222122221

    • Offizieller Beitrag

    Echtes Multithreading wird es laut Entwicklern in AutoIt nicht geben. Und ganz ehrlich... ich bastele gerade an einfachem Multithreading in Java - das ist nichts, was man sinnvoll in eine Skriptsprache einbauen kann imo. Es ist ein verdammt komplexes Konzept, wenn man es sauber einbaut - und alles andere macht wieder nicht wirklich Sinn.

    Es gibt eine Multithreading-UDF, die es so ein bisschen nachbaut, man hat AdlibEnable und man kann beliebig viele Skripte parallel laufen lassen - ich denke, dass muss reichen.

    peethebee

  • ich weiss natürlich nicht was du mit echten Multitreating meinst, für mich wären das einfach 2 autoit scripts nebeneinander, und wie schon oben gesagt habe ich viele User mit den verschiedenen Fragen zum gleichen Thema gesehen.

    Da es sowas nie geben wird werd ich halt dann damit leben müssen 2 scripts zu starten, kann ich dann in einem Programm globale Variabelen definieren, auf die ich auch auf dem anderen Programm zugreifen kann ? ( und ich meine jetzt nicht speicherauslesen von autoit etc um mir den varialenwert zu holen )

    • Offizieller Beitrag

    @Bullz: Wieso brauchst Du für so ein einfaches Problem Multithreading?

    Das läßt sich doch mit Hilfe zweier Timer ganz einfach lösen:

    [autoit]


    Run("notepad.exe")
    WinWait("Unbenannt")

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

    $t1 = TimerInit()
    $t2 = TimerInit()
    while 1
    If TimerDiff($t1) > 2000 Then
    Send(1)
    $t1 = TimerInit()
    EndIf
    If TimerDiff($t2) > 1750 Then
    Send(2)
    $t2 = TimerInit()
    EndIf
    WEnd

    [/autoit]
  • so da habe nun etwas ergänzt, das war natürlich nur ein Bsp Programm. Meine Programme haben öfter längere Schritte dazwischen das das so nicht mehr funktioniert... in den 10 sekunden sleep könnt ne bombe einschlagen, autoit würde einfach " sleepen " ... deswegen hätte ich gern irgendwas gehabt aber anscheinend werd ich mit z.b 2 autoit scripten gleichzeitig arbeiten müssen..

    kann man auf Variablen,timer usw von einem zur gleichen Zeit laufenden Autoit zugreifen ?

    • Offizieller Beitrag

    so da habe nun etwas ergänzt, das war natürlich nur ein Bsp Programm. Meine Programme haben öfter längere Schritte dazwischen das das so nicht mehr funktioniert... in den 10 sekunden sleep könnt ne bombe einschlagen, autoit würde einfach " sleepen " ... deswegen hätte ich gern irgendwas gehabt aber anscheinend werd ich mit z.b 2 autoit scripten gleichzeitig arbeiten müssen..

    Dann solltest Du Deine Programme mal überdenken, denn 10 sek. sind Welten. Was machen Deine Programme so lange? Ich hoffe nicht wirklich einen oder mehrere Sleep()!?

    • Offizieller Beitrag

    Hallo,

    mit der aktuellen Beta kann man es so machen!


    Spoiler anzeigen
    [autoit]

    ; Läuft nur mit der aktuellen Beta

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

    #Include <Timers.au3>

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

    Run("notepad.exe")
    WinWait("Unbenannt")

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

    $hGUI = GUICreate("", 400, 320) ; Windows-Handle für Timer erzeugen
    GUISetState(@SW_HIDE)

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

    _Timer_SetTimer($hGUI, 2000, "Print1") ; Timer für Print1
    _Timer_SetTimer($hGUI, 1750, "Print2") ; Timer für Print2
    _Timer_SetTimer($hGUI, 250, "Print3") ; Timer für Print3

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

    while 1
    sleep(10000) ; Auch 10 Sekunden schlaf stört die Timer nicht
    WEnd

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

    Func Print1($hWnd, $Msg, $iIDTimer, $dwTime)
    #forceref $hWnd, $Msg, $iIDTimer, $dwTime
    ControlSend("Unbenannt", "", "Edit1", "1")
    EndFunc

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

    Func Print2($hWnd, $Msg, $iIDTimer, $dwTime)
    #forceref $hWnd, $Msg, $iIDTimer, $dwTime
    ControlSend("Unbenannt", "", "Edit1", "2")
    EndFunc

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

    Func Print3($hWnd, $Msg, $iIDTimer, $dwTime)
    #forceref $hWnd, $Msg, $iIDTimer, $dwTime
    ControlSend("Unbenannt", "", "Edit1", "3")
    EndFunc

    [/autoit]