AdlibRegister sinnvoll einsetzen

  • Guten Tag,

    ich hab ein skript geschrieben, welches eine Fehlerdatenbank verwaltet. Darin brauche ich einige abfragen, welche ich immer wieder überprüfen muss.

    Bisher habe ich diese einfach in der Haupt While-Schleife geschrieben, was auch funktioniert. Ich habe allerdings in einem anderen Thema gelesen, das man besser für so was AdlibRegister verwenden soll.

    Da es aber sehr viele solcher abfragen sind, ist das sinnvoll? Und welche Zeiten machen dafür Sinn, das der Nutzer nicht bemerkt, das da ein moment vergeht.

    Mit freundlichen Grüßen

    Flo

    Mit freundlichen Grüßen

    Flo

  • Ich kann hier nur über meine persönliche Meinung dazu sprechen (mögen andere mich korrigieren).

    Ich halte AdlibRegister für weitestgehend nutzlos. Eine (meiner Meinung nach) bessere Methode sind Funktionen mit Static Timer, da diese an einem Ort ausgeführt werden den "ich" festlege, während AdlibRegister Funktionen "überall" aufgerufen werden können und den Programmablauf damit durcheinanderbringen (außer man hat seine Programmstruktur extra darauf ausgelegt).

    Beispiel:

    Man kann diese Funktionalität auch Wrappen, sodass man z.B. eine Funktion hat die "SetTimer($xFunc, $ms)" hat, usw.

    Wenn du nicht willst, dass der Nutzer davon etwas mitbekommt musst du dafür sorgen, dass die Abfragen einzeln relativ schnell durchlaufen, dann kannst du im Mainloop z.B. immer ein paar Millisekunden zur Verfügung stellen um Abfragen abzuarbeiten. Sind diese Millisekunden aufgebraucht werden die restlichen Abfragen erst im nächsten Schleifendurchlauf angegangen. Sowas lässt sich mittels Queue + Timer regeln (z.B. Alle 5 Sekunden sollen 100 Abfragen gemacht werden, dann werden alle 5 Sekunden die 100 Abfragen in den Queue gesteckt (das geht sehr schnell), und in jedem Schleifendurchlauf werden ?? Millisekunden lang Abfragen bearbeitet bis der Queue leer ist. Da muss man aber aufpassen wenn Abfragen aus welchem Grund auch immer nicht abgearbeitet werden können, dann wird der Queue immer länger und das wollen wir ja nicht).

    lg

    M

  • Ich halte AdlibRegister für weitestgehend nutzlos. Eine (meiner Meinung nach) bessere Methode sind Funktionen mit Static Timer, da diese an einem Ort ausgeführt werden den "ich" festlege, während AdlibRegister Funktionen "überall" aufgerufen werden können und den Programmablauf damit durcheinanderbringen

    Dazu ein klares "JEIN" :rofl:

    Hier gilt eigentlich, wie immer, dass man wissen muss, was man tut. Ich verwende AdlibRegister recht gerne um unabhängig vom Mainloop zu sein. Die Ausführungsbedingungen werden dann durch entsprechende Variablen geregelt. Bsp.:

    Eine beliebige WM-Message Funktion wird ausgewertet. Diese muss so schnell wie möglich wieder verlassen werden aber evtl. zeitintensivere Operationen sollen damit angeschoben werden. Dazu setze ich dann eine Globale Prüfvariable, die ich in der Adlib-Funktion auswerte.

    Ist auch zum Teil Geschmackssache. Ich habe mich nie mit Timern anfreunden können und verwende diese deshalb eher selten. ;)

  • Hallo!

    Ein guten Beispiel ist eine asynchrone Anzeige (zumindest für mich):

    Beispiel: Ich habe in der Hauptschleife eine längere Berechnung die ein paar Minuten Zeit braucht. Die Datenmenge die ich verarbeite hat manchmal in einem Array 50000 Einträge oder mehr. Jetzt wäre es für den Anwender eher "unangenehm" wenn nur steht "bitte warten....Verarbeitung läuft!" oder so......

    Ich mache dann mit dem Adlibregister mit einer hohen Zeit (+2000) eine Anzeige für den Fortschritt (Balken, Zähler, Countdown,...)

    Warum der Aufwand: Würde ich jeden Eintrag in der Hauptschleife ausgeben, würde die Verarbeitung noch länger dauern. Nichts hinschreiben ist auch nicht gut. Und so habe ich einen goldene Mitte gefunden.......

    Gibt sicher noch viele andere Anwendungsmöglichkeiten, hauptsache die Funktion ist mit möglichst wendig Zeit durchgelaufen...

    lg

    Racer

  • Keine Ahnung, wie AdlibRegister implementiert ist, aber man sollte auch bedenken, dass normalerweise, wenn mit solchen Funktionen gearbeitet wird, Mechanismen verwendet werden, die keinen Code ausführen und die Zeit warten, ohne Code auszuführen.

    Dementsprechend sollte man diese Nutzen um Anweisungen zu sparen => bessere Performance und ggf. bei Laptops relevant: Prozessorkerne werden in den Ruhezustand verlagert, bis es weitergeht.

    So wie der Code von Mars geschrieben ist, wird permanent Code ausgeführt => (Das Sleep dürfte ebenfalls darunter fallen und das Problem mindern, aber im letztendlich wird alle 10ms Code ausgeführt, der ggf. komplett unnötig ist).

    Ist halt die Farge, wie wichtig einem so etwas ist, aber bei vielen Programmen, die so programmiert werden summiert es sich... Deshalb würd ich sagen, dass dauerschleifen eher schlecht sind, wenn nicht permanent was passieren soll.

    Bei Code für Smartphones sieht man sowas ganz gut. Alles ist darauf ausgelegt, dass es von außen angestoßen wird und möglichst nirgends permanente Überwachungsschleifen sind. Dadurch hat das Betriebssystem mehr Kontrolle und kann ggf. Energiesparmaßnahmen durchführen.

    Am PC seh ich es aber nicht ganz so kritisch und wenn eh Code ausgeführt wird, der die Schleife sowieso erfordert, seh ich auch keinen Grund nicht noch 6 Anweisungen mehr zu machen, wenn es einfacher ist.

    Mit den Ressourcen, die heutzutage zur Verfügung stehen, wird in vielen Fällen eh nicht mehr wirklich viel auf Optimierung geachtet.

    Bezogen auf die Ürsprüngliche Anfrage von Flo...:

    Wenn du eh die ganze Zeit mit Usern interagierst und dein Code läuft, kann es Sinn machen, die Anfragen in die Schleifen einzubauen. Je nachdem, wie lange die sich wiederholenden Abfragen dauern, macht es ggf. Sinn, diese aufzuteilen um den ersten Teil auszuführen, dann die Hauptschleife wieder abzuarbeiten (und auf User-Input zu reagieren) und den anderen Teil danach weiter auszuführen. Das kommt halt ganz drauf an, wie dein Code aussieht und wie lange die Abfragen und deren Verarbeitung dauern.