Adlib UDF nicht parallel

  • Hallo,

    ich habe mehrere Bars die die CPU Auslastung darstellen. Diese möchte ich "sauber" gleiten lassen. Das Problem wa sich habe dass ich 8 Kerne besitze (4 Cores + HT). Nun wir immer nur 1 Balken sauber bewegt und dann der nächste, das ist natürlich totaler misst. Deswegen wollte ich das mit Adlib machen. Dazu habe ich mir die UDF (spuckt übrigens Warnungen aus) geschnappt und eingebaut. Trotz Adlib werden alle Balken nur nach einander bewegt statt parallel.

    So rufe ich Adlib auf, für den Kern ein Adlib. Was mache ich falsch?

    Einmal editiert, zuletzt von EvilMoe (27. Juli 2011 um 02:11)

  • Adlib.au3 benötigst du nicht mehr, die Funktionalität wurde komplett in AdlibRegister abgebildet.
    Durch Adlib werden keine echten Threads erzeugt, sondern die Funktionen werden nacheinander ausgeführt. AutoIt unterstützt kein Mulitthreading. Um dein Problem zu lösen solltest du die GUI sperren, das Update durchführen und anschließend wieder entsperren.

  • In Adlibregister kann ich keine Parameter übergeben, da ich aber eine Variable Anzahl an Cores habe ist das nötig.
    Wofür gibt es dann AdlibRegister wenn die trotzdem nacheinander abgearbeitet werden? Das ist doch eh immer der Fall.

  • Hallo EvilMoe,

    mir ist aufgefallen dass deine Schleife zum Erstellen der Progressbars nie verlassen wird. Auch nimmst du einen falschen Startwert für die Schleife. Ich würde es so machen:

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ; ================== CPU Bars variabel erstellen
    ;===============================================================================
    For $iCore = 1 To $CORES

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

    ;$cpu = $iCore+1
    $height = 10
    $abstand= 40

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

    MsgBox(0, 'test', $iCore)

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

    $height = ($iCore-1) * $abstand + $height

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

    $BARSLABEL[$iCore] = GuiCtrlCreateLabel("", 25, $height, 200, 12)
    $BARS[$iCore] = GUICtrlCreateProgress (25, $height+15, 250, 15, $PBS_SMOOTH)

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

    GuiCtrlSetData(-1, $CPUS[$iCore])

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

    ; Multithread betrieben für jede bar einen eigenene
    _AdlibEnable("refresh_core", 25*$CORES, -1, $iCore)
    Sleep(25)

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

    ;DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", GUICtrlGetHandle($BARS[$cpu]), "wstr", "", "wstr", "")
    Next

    [/autoit]

    kann es aber nicht testen da nur 1 CPU

    mfg autoBert

  • Wofür gibt es dann AdlibRegister wenn die trotzdem nacheinander abgearbeitet werden? Das ist doch eh immer der Fall.


    Adlib ist dazu da, Funktionen zeitgesteuert periodisch auszuführen und nicht, um Threads zu erstellen.


  • Adlib ist dazu da, Funktionen zeitgesteuert periodisch auszuführen und nicht, um Threads zu erstellen.

    Überall wenn ich die Suche verwende um "Multithreading" oder nach "parallel" suche wird gesagt das man das mit Adlibregister machen kann.

  • Leider auch nicht, der Startwert ist richtig, der liegt bei 0.
    Die Schleife hat bei mir richtig funktioniert.

  • Adlib ist nicht multithreading. Eine Adlib Funktion ist mehr oder weniger ein Funktionsaufruf innerhalb einer laufenden Funktion. Das bedeutet deine aktuelle Funktion wird kurz unterbrochen, die Adlibfunktion eingeschoben und dann gehts wieder mit dem weiter was gerade abgearbeitet wurde. In gewisser weisse läuft aber etwas paralell, nämlich die Zeitmessung um zu bestimmen wann die Adlibfunktion erneut eingeschoben werden soll. Der code selbst wird aber nich paralell ausgeführt. Daran ändern auch multiple adlib Funktionen nichts.

    Um wirklich etwas paralell auszuführen benötigst du eine seperate exe Datei. Diese könnte zum Beispiel per controlcommand() oder vergleichbaren Fenster Funktionen deine Haupt GUI verändern. Ob das Sinn macht und besser funktioniert bezweifle ich aber.

  • Überall wenn ich die Suche verwende um "Multithreading" oder nach "parallel" suche wird gesagt das man das mit Adlibregister machen kann.

    Weil diese Leute die Begriffe falsch verwenden.
    AutoIt kann mit Adlib... Multitasking schaffen was zu einer Quasiparalellität führt aber zu keiner echten.
    Dir wurde es hier mehrmals gesagt und du musst dich nun mal damit abfinden das du mit AutoIt KEIN Multithreading hinbekommst.
    Da kannste auch noch so oft immer wieder darauf antworten das du da was anderes gehört hast oder du das anders siehst - weiterhelfen wird dir das nicht.