2 Funktionen gleichzeitig - Programm hängt sich auf

  • Ich habe ein Problem mit einem stück code aus meinem programm, genauer gesagt einer funktion

    nehmen wir mal einfach ein vorgang als beispiel

    [autoit]

    #include <File.au3>

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

    $windir = EnvGet("WINDIR") & "\"
    $files_tempwin = _FileListToArray($windir & "temp\", "*.*")

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

    If @error <> 4 Then
    For $i = 1 to $files_tempwin[0]
    If StringInStr(FileGetAttrib($windir & "temp\" & $files_tempwin[$i]), "D") >= 1 Then
    DirRemove($windir & "temp\" & $files_tempwin[$i], 1)
    Else
    FileDelete($windir & "temp\" & $files_tempwin[$i])
    EndIf
    Next
    EndIf

    [/autoit]

    hier wird werden alle dateien des tempverzeichnisses im systempfad gelistet und dann, wenn dateien vorhanden sind unterschieden ob dateien oder ordner damit ich den kompletten temp leeren kann

    dies sowie der rest funktioniert einwandfrei, wenn nicht noch eine funktion hinzukommt

    ich aktiviere mit

    [autoit]

    AdlibEnable("_prozent", 100)

    [/autoit]

    meine funktion

    [autoit]

    Func _prozent()

    $size = 0

    $size = $size + DirGetSize($windir & "$hf_mig$\")
    $size = $size + DirGetSize($windir & "ServicePackFiles\")
    $size = $size + DirGetSize($windir & "Prefetch\")
    $size = $size + DirGetSize($windir & "Driver Cache\i386\")
    $size = $size + DirGetSize($windir & "system32\dllcache\")
    $size = $size + DirGetSize($windir & "SoftwareDistribution\Download\")
    $size = $size + DirGetSize("C:\temp\")
    $size = $size + DirGetSize($windir & "temp\")
    $size = $size + DirGetSize($userdir & "temp\")
    $size = $size + DirGetSize($userdir & "Lokale Einstellungen\temp\")

    $size = $size / 1024^2

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

    $unterschied = $dir_size[12] - $size

    $prozent = StringFormat("%.2f", Round(($unterschied / $dir_size[12]) * 100, 2))

    GUICtrlSetData($lb_prozent, $prozent & " %")
    EndFunc

    [/autoit]

    und wenn ich das tue, hängt sich mein programm nach kurzer zeit auf (cpu auslastung 90-100 %)

    ich verstehe das nicht, was mache ich falsch?

  • kenne mich mit adlibenable nicht so aus, aber vielleicht solltest du es nicht alle 100 ms abfragen, da während adblibenable das hauptskript pausiert wird. Deswegen sollte die von ihm aufgerufene Funktion auch sehr klein gehalten sein - und ich denke mal dass er bei deiner funktion länger brauchen wird als 100 ms... probiers doch einfach mal mit 1000 oder 2000.... nur ein Gedanke

  • falls das wirklich der fall sein sollte, ist aber hochsetzen der zeit auch keine gute alternative
    denn wenn man gleichzeitig das system auslastet könnte ich mir vorstellen dass die funktion dann auch länger als 1sec oder 2 sec brauchen könnte... =S

    ich wusste nicht dass mein skript an der einen stelle pausiert wird, ich dachte das läuft parallel

    gibts nicht irgendwie ne lösung für das problem? =O
    da bin ich doch sicher nicht alleine

  • Zitat

    Die adlib Funktion sollte einfach gehalten werden, da sie oft ausgeführt wird und während dieser Zeit das Script pausiert.
    Außerdem sollte vorsichtig mit dem time-Parameter umgegangen werden um unnötige CPU-Last zu vermeiden.

    Das sagt zumindest die Hilfe. Und warum soll das hochsetzen der Zeit denn nicht klappen? wenn die von adlib aufgerufene funktion (vor allem durch festplattenzugriff & co) 3 sekunden benötigt, du sie aber jede Sekunde abfragst wird das ganze in eine Art warteschleife gepackt - zumindest ist es das Verhalten, welches ich oft bei AutoIt und "zu früh aufgerufenen Funktionen" erkennen konnte. Somit wird dein Hauptskript unendlich lange angehalten, und der prozessor ist nach einiger zeit mit den ganzen Anfragen überlastet. (250ms für 10 verzeichnisse also muss er in einer Sekunde 40 verzeichnissgrößen auslesen + der Rest deiner funktion. Ich bin mir da echt nich so sicher ob das überhaupt so schnell geht)

  • Hi ..

    Ich misch mich hier mal ein ..

    also ein "Parallelen" Ablauf in einem Programm gibt es nicht.
    EINZIGE Ausnahme wäre, wenn du einen (mindestens) dual-Core Rechner besitzt und den OHNE Betriebsystem direkt sagst, welche Aufgabe, welcher Core, zu tun hat.

    ( aber mit AutoIT sicher nicht lösbahr )

    alles andere nennt sich Multhi-Threading .. oder so ..

    d.h. ein scheinbar paraleller ablauf. wird so erzeugt, dass die aufgaben in kleine "mini" aufgaben zerhackt werden.

    aber auch das, ist mit AutoIt nicht hin zu bekommen, sogar GUTE C Programmierer, werden sich hierbei fast ein Bein ausreisen müssen.
    Hab mal ein C- code gesehen, der mehrere Funktionen "zeitgleich" in Echtzeit verarbeitet .. WAHNSINN .. alles voll mit Timern, die andere Timer starten .. und hin und her ..

    .. schweife ab ..

    noch mal zu der Adlib funktion ... macht nix anderes, wie dein " skript" pausieren, .. in der pause, die funktion abarbeiten.

    Meine bisherigen Erfahrungen : bei zuvielen Variablen in einem Skript, so war es zumindest bei mir der fall, werden machne verändert. ( unauffindbahrer Grund )

    ausschlaggebend bei mir, habe in der Funktion die durch die adlib aufgerufen wird, eine Funktion verwendet, welche auch sonnst im Programm verwendet wurde.

    hab halt einfach nicht so funktioniert, wie es sollte..

    ich würde die finger davon lassen ....

    obwohl es sehr reizvoll wäre .. ;)

    bye

  • Das Problem ist, dass die Funktion nicht in 100 ms fertig ist.

    Um wirklich gleichzeitig Funktionen nebeneinander abzuarbeiten muss man die Skriptsprache Autoit verlassen und sich einer Hochsprache zuwenden.

  • reduziere doch einfach den aktualisierungsintervall von adlibenable auf 2 sek (zeit erhöhen)...
    weil, wie schon gesagt, das script aus der AdLibENable nicht mehr rauskommt. Denn sobald die Funktion, die AdLibEnable aufruft zuende ist, sind die 100ms bereits wieder abgelaufen und AdlibEnable startet sofort wieder..
    Es kommt also gar nicht mehr zum Hauptscript.
    (Alles abhängig davon, was so im Temp alles rumliegt...)

    hoffe, das war verständlich...

    ... wasweisichdennschon...

  • Hab nen Netbook mit 1,6GHz, da dauert die Routine etwas länger als bei nem Gamer PC.
    Würde das ganze lieber sich anpassen lassen.

    Spoiler anzeigen
    [autoit]


    Func _prozent()
    $begin = TimerInit()

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

    $size = 0

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

    $size = $size + DirGetSize($windir & "$hf_mig$\")
    $size = $size + DirGetSize($windir & "ServicePackFiles\")
    $size = $size + DirGetSize($windir & "Prefetch\")
    $size = $size + DirGetSize($windir & "Driver Cache\i386\")
    $size = $size + DirGetSize($windir & "system32\dllcache\")
    $size = $size + DirGetSize($windir & "SoftwareDistribution\Download\")
    $size = $size + DirGetSize("C:\temp\")
    $size = $size + DirGetSize($windir & "temp\")
    $size = $size + DirGetSize($userdir & "temp\")
    $size = $size + DirGetSize($userdir & "Lokale Einstellungen\temp\")

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

    $size = $size / 1024^2

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

    $unterschied = $dir_size[12] - $size

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

    $prozent = StringFormat("%.2f", Round(($unterschied / $dir_size[12]) * 100, 2))

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

    GUICtrlSetData($lb_prozent, $prozent & " %")

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

    $dif = TimerDiff($begin)
    AdlibDisable ( )
    AdlibEnable("_prozent", $dif * 4);Löschroutiene = 3/4 der Zeit, Prozentroutine = 1/4 der Zeit
    EndFunc

    [/autoit]

    Ungetestet!