Funktion in der While Schleife nur alle x mal Starten

  • Hallo,

    ich bräuchte einen Tip wie bekomme ich es hin das ich eine Funktion nicht bei jedem Schleifendurchlauf ausführe.

    Hat jemand ein Beispiel oder einen Link zum Lesen. Habe nicht direkt was gefunden. (Vielleicht falsche Suchbegriffe)
    Klar so in der Art. Mit If ist mir auch Klar nur lösche ich dann $i mal wieder auf Null oder macht man das anders ?

    Frohes Fest

    Steffen


  • Hey :)
    Deine Idee sollte eigentlich fast funktionieren, ein Problem könnte aber auf jeden Fall sein, dass du im ElseIf die Bedingung < 10 genommen hast, in der If Bedingung aber > 10. Das würde bedeuten, dass du bis 10 hochaddierst, danach aber weder auf 0 resettest noch auf 11 kommst um die If Bedingung > 10 aus zu lösen. Versuche es einfach mal mit = 10 in deiner ersten If Bedingung.

    Frohes Fest :)

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Hi,

    ist doch ein gangbarer Weg, allerdings hast Du Syntaxfehler in Deinem Script:


    Allerdings wird der untere Teil dann nach 10 Durchläufen auch 1 mal nicht ausgeführt. Stattdessen nur der obere Teil. War das denn so geplant?
    Ansonsten könnte man es auch so umstricken:

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2

    2 Mal editiert, zuletzt von Cape-City (24. Dezember 2016 um 00:47)

  • Hey :)
    Deine Idee sollte eigentlich fast funktionieren, ein Problem könnte aber auf jeden Fall sein, dass du im ElseIf die Bedingung < 10 genommen hast, in der If Bedingung aber > 10. Das würde bedeuten, dass du bis 10 hochaddierst, danach aber weder auf 0 resettest noch auf 11 kommst um die If Bedingung > 10 aus zu lösen. Versuche es einfach mal mit = 10 in deiner ersten If Bedingung.

    Frohes Fest :)

    Ich denke damit kam er nie in den If-Bereich, denn sein Script hat nur bis 10 gezählt, das war aber noch zu klein für die If-Abfrag und schon zu groß für die ElseIf :D

    ~~~~~~~~~~~~~~~~~~~~~~~~
    Grüße
    Cape-City

    Grafik/Sound Demo (InfoBox)

    OS: Windows 10 Pro - System: Intel Core i5-3320M CPU @ 2.60GHz - AutoIt-Version: 3.3.14.2

  • So habe mal etwas rum gespielt.

    Will das bestimmte Funktionen alle 3 sek andere 1 x in der Stunde andere alle 5 Minuten.

    oder kann man den Zähler durchlaufen lassen ? Gibt es dort Probleme bei 7/24 Betrieb?

  • So habe mal etwas rum gespielt.

    Will das bestimmte Funktionen alle 3 sek andere 1 x in der Stunde andere alle 5 Minuten.

    oder kann man den Zähler durchlaufen lassen ? Gibt es dort Probleme bei 7/24 Betrieb?

    Warum kein AdlibRegister für die Funktionen? Dann sparst du auch dir die Zählervariable. Du brauchst dann nur eine Standard While-Sleep(100)-WEnd-Schleife.
    Weiß jetzt nicht ob deine Funktionen blockierend sind oder parallel laufen dürfen.

  • Warum kein AdlibRegister für die Funktionen? Dann sparst du auch dir die Zählervariable. Du brauchst dann nur eine Standard While-Sleep(100)-WEnd-Schleife.Weiß jetzt nicht ob deine Funktionen blockierend sind oder parallel laufen dürfen.

    Es gibt Funktionen die sollten vor anderen Funktionen laufen.

    AdlibRegister war mir vorher noch nicht bekannt.

    Hier mal mein ganzer Code ohne AdlibRegister.

    Einmal editiert, zuletzt von SCCSSF (24. Dezember 2016 um 13:14)

  • Hallo @SCCSSF,

    Wenn etwas einmal die Stunde oder alle x Stunden ausgeführt werden soll, könntest du es auch etwas schräger machen.
    Das folgende ist bestimmt Pfusch und irgendwer, der das liest, wird wohl seinen Kopf auf die Tischplatte hauen. Aber es ist ja Weihnachten :D

    Grüße autoiter

  • Wenn etwas einmal die Stunde oder alle x Stunden ausgeführt werden soll, könntest du es auch etwas schräger machen.
    Das folgende ist bestimmt Pfusch und irgendwer, der das liest, wird wohl seinen Kopf auf die Tischplatte hauen. Aber es ist ja Weihnachten :D

    Aber... aber warum? :D

    Wenn du es noch schräger haben willst kannst du ja ein PHP-Script schreiben das auf einem Webserver läuft wo das Script auf dem Clienten alle 5 Sekunden die Infos runterlädt ob er die Funktionen ausführen soll oder nicht :D

  • Das mit der Stunde überlege ich mir maL

    Vielleicht lasse ich es auch nur alle 24 h laufen.
    Ich habe noch nicht unter Last getestet. Im Archiv werden ca. 2000-3000 Dateien liegen nach 40 Tagen. Das kommt dann nicht auf eine Stunde drauf an.

    @autoiter @alpines Frohes Fest

  • Obwohl sich das wie in meinem Beispiel anwenden lässt, benutze ich die Funktion nur bei kurzen Zeiträumen. Einfach weil ich die Ausgabe hässlich finde :D
    Aber klar. So hat man definitiv eine leicht freiere, genauere Zeitraumfestlegung ;)
    Für die Funktionen die nur in x-Stunden oder Tagen laufen sollen, ist das so natürlich nicht notwendig. Aber es hat definitiv seinen Charme alles damit zu machen, weil man dann diese hässlichen und vllt. verwirrenden Schleifen in der Schleife umgeht und alles im selben Stil macht.

    Grüße autoiter

  • Nur mal so als Idee in den Raum geworfen:
    TimerInit()
    TimerDiff()

    Wofür gibt es die beiden Funktionen denn, wenn nicht dafür :D

    Kann man einfach den Zeitabstandprüfen und den Timer einfach jedesmal neu initialisieren^^

    Kommt bei SCCSSFs Implementation letzlich auf das Gleiche hinaus ob ich nun einen Timer resette oder die Zählervariable.

  • Im Grunde ja, @alpines,
    aber es würde imho besser aussehen als die aktuelle Umsetzung und es würde einen einheitlichen Stil für alle Funktionsaufrufe ermöglichen.

    Meiner Meinung nach ist das schon in Ordnung so, das Problem mit den Timern wäre der If-Zweig mit _PDFMerge() dort will man alle 100 Sekunden das ausführen.
    Nun ich weiß nicht wie lange die Funktion dafür braucht aber wenn man das mit Timern macht dann muss man dafür automatisch einen Zähler dazunehmen, der Grund dafür ist folgender:

    In diesem Fall resette ich den Timer nur wenn ich über die 1200 Sekunden drüber bin und nicht wenn ich alle 100 Sekunden _PDFMerge() ausführen möchte.
    Das Problem ist nun, das _PDFMerge eine sehr schneller oder sehr kurze Funktion sein kann, und wenn ich die CPU-Last des Programms minimieren möchte und in die While-Schleife ein Sleep(10) reinpacke, dann laufe ich Gefahr das ich niemals Mod(TimerDiff($tmr), 1200 * 1000) = 0 zu erfüllen.

    Also muss ich das so machen das er _PDFMerge() ausführt wenn die Mod-Bedingung = 0 oder kleiner als eine bestimmte Toleranz ist (siehst du gleich am Beispiel.)
    Damit man sich nicht damit rumärgern muss, kann man nun eine Zählervariable einführen (in meinem Beispiel $iPassed).

    Hier hast du mal das Beispiel das die Implementation als Timer zeigt (einmal mit Zählervariable und einmal mit der Toleranzbedingung)

    Wenn du das Script ausführst wirst du merken, das das Sleep(10) in der Schleife die Modulobedingung behindert.
    Der String "Counter Passed!" wird alle zwei Sekunden in die Console geschrieben aber der String "Modulo Passed!" wird manchmal ausgelassen.

    Du hast nun folgende Möglichkeiten um das Problem zu beseitigen, einmal kannst du das Sleep(10) weglassen, dann würde aber der Modulo Passed Zweig sehr häufig ausgeführt werden,
    oder du passt die < 5 in der If-Abfrage an. Wenn du nun die 5 auf 10 oder höher setzt, dann läufst du ebenfalls Gefahr die Funktion mehrmals auszuführen.

    Deshalb brauchst du hier noch die Extrazählervariable $iPassed, und wenn die Funktionen von @SCCSSF implementierst (einmal als $iWhile += 1 und einmal als Timer) dann wirst du merken, dass man sich die Timer auch ehrlich gesagt schenken kann, weil man auch noch den Zähler zurücksetzen muss. (meine Meinung).


    Frohes Fest ;)

  • Für so etwas gibt es die Aufgabenplanung in Windows. Ist eigentlich komplett sinnfrei und auch ineffizient das nochmal separat nachzubauen.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hallo,

    @chip @alpines

    Natürlich ginge Aufgabenplanung. Aber ich möchte ebbend nicht mehr dran denken, wenn ich was ändern sollte auch dort was zu Überprüfen.

    Ich habe meine ersten Sachen 2008 in Autoit geschrieben und dann läuft es Jahre und dann soll ich mal ebbend was ändern.

    So finde ich es gleich wieder.

    Ich habe mal den Ansatz von @autoiter angenommen.

    Die Global Sachen stehen natürlich Außerhalb.
    Klar könnte ich es noch in eine Funktion auslagern.
    So läuft die Aufräum Aktion 1 x am Tag.

    Ich kann bei meinen Variablen die Start-Stunde festlegen.

    Wie gefällt Euch dies ?