Script in Dauerschleife ohne große CPU-Last

  • Nächstes Problem:

    ich möchte ein Programm in Endlos-Loop schreiben,

    das in einem Verzeichnis (nicht zeitkritisch) prüft, ob dort eine (neue) Datei ist

    diese liest und den Inhalt interpretiert und dann löscht.

    Kann ich natürlich mit While ... Sleep(1000) ... Wend machen, aber ist das die optimale Lösung?

    Mein erstes Programm bestand aus ca. 2.000 Lochkarten und nachdem sie mir das erste mal runtergefallen sind, habe ich die letzten beiden der 80 Byte für eine Numerierung benutzt :rofl:

  • https://www.autoitscript.com/a…lChangeNotifyRegister.htm


    Das da wäre die beste Lösung, da Windows deinem Skript bescheid gibt, wenn sich in einem bestimmten Pfad was tun sollte, dann kann deine Hauptschleife einfach Sleep(1000) ablaufen.

    Alternativ könntest du natürlich auch mit FileExists oder ählichem prüfen und immer sleepen, hast aber immer jede Sekunde Lesezugriffe auf deine Platte sofern sie nicht gecached sind,

    ich weiß nicht wie viele Daten du liest oder erkennen möchtest, aber das kann sich unter Umständen auf die Lebenszeit der Festplatte auswirken.

  • ich weiß nicht wie viele Daten du liest oder erkennen möchtest

    Wir haben eine alte DOS-Kundenverwaltung, die mit der Windows-Welt nur durch das Schreiben von kleinen Batches kommunizieren kann bzw. darf. Bedeutet, dass alle paar Minuten oder teilweise auch Stunden in einem reservierten Verzeichnis eine Datei erscheint, die ich künftig nicht mehr als Batch ausführen will, sondern mit meinem AutoIt-Script interpretieren. While ... Sleep ... Wend wäre damit vermutlich die schlechteste Lösung. Soll resourcenschonend ablaufen.

    Mein erstes Programm bestand aus ca. 2.000 Lochkarten und nachdem sie mir das erste mal runtergefallen sind, habe ich die letzten beiden der 80 Byte für eine Numerierung benutzt :rofl:

  • Kann ich natürlich mit While ... Sleep(1000) ... Wend machen, aber ist das die optimale Lösung?

    Nein, in den meisten Fällen wohl eher nicht. Du kannst dich mit _WinAPI_ShellChangeNotifyRegister benachrichtigen lassen, wenn sich in dem/den von dir beobachteten Verzeichnis/sen etwas geändert hat, und solange keine Message kommt, kann dein Script schlafen. In der AutoIt-Hilfe findest du ein Bsp. dazu... und im Anhang ein Script von mir zu diesem Thema, darin kannst du sehen, was du damit alles anstellen kannst.


    PS: _WinAPI_ShellChangeNotifyRegister funktioniert aber nur auf Festplatten, die mit NTFS formatiert wurden!


    Edit: Hatte vergessen _SplitPath.au3 in das Archiv zu packen, dass ich nun hinzugefügt habe und auch ein Bsp. für _SplitPath.

  • Das da wäre die beste Lösung, da Windows deinem Skript bescheid gibt, wenn sich in einem bestimmten Pfad was tun sollte,

    Zitat von _WinAPI_ShellChangeNotifyRegister

    Registers a window to receive notifications from the file system or Shell

    Kann man dann aber nur anwenden, wenn man eine Anwendung mit GUI laufen hat, was für Überwachungsskripte eher nicht der Fall ist. Ich habe bei mir ein Skript laufen, das alle 5 Sekunden in einem Ordner schaut, ob eine neue PDF abgelegt wurde. Diese wird dann nach bestimmten Kriterien umbenannt und an eine andere Anwendung weitergereicht. Dafür existiert selbstredend keine grafische Oberfläche.

    Ich vermute mal, bei HansJ54 sieht das ähnlich aus.

  • Kann man dann aber nur anwenden, wenn man eine Anwendung mit GUI laufen hat, was für Überwachungsskripte eher nicht der Fall ist. Ich habe bei mir ein Skript laufen, das alle 5 Sekunden in einem Ordner schaut, ob eine neue PDF abgelegt wurde.

    Zwar ist die GUI hier nur Mittel zum Zweck aber eine Extrazeile im Skript wird dir ja wohl nicht das Genick brechen oder?

    Ich würde das Argument ja verstehen wenn wir keine Desktopumgebung hätten wie bei Linux, aber das ist auf Windows definitiv nicht der Fall.


    Der TE hat ja sein Problem auch nicht weiter erläutert, ob er in dem Skript noch Infos anzeigt oder ähnliches also ist hier die Problematik eine Extra GUI zu erzeugen meiner Meinung nach vollkommen irrelevant.

    Selbst das Erzeugen/Laufenlassen einer GUI frisst kaum Ressourcen.

  • Mal genauer erklärt:

    Ich nutze wd_core von Dan und Webdriver/Selenium um Webseiten zu öffnen und den jeweiligen Benutzer anzumelden. Die Kundenverwaltung schreibt aus der abgeschotteten DOS-Umgebung nur eine Textdatei mit dem Namen der gewünschten Seite in ein bestimmtes Verzeichnis und das neue Programm öffnet den Browser und übernimmt die Anmeldung. Gleichzeitig kann der User aber auch direkt von Windows aus diesen Vorgang starten.


    Wäre alles kein Problem und könnte "einzeln" laufen wie bisher, wenn wir nicht immer dasselbe Profil nutzen müssten. Und das bekomme ich mit dem Webdriver und wd_core nicht hin. Wenn ich das Programm verlasse und neu starte und noch eines der vorherigen Fenster offen ist, hakt es. Und alle offenen Fenster bei Neustart schließen ist auch nicht gewünscht. Das Programm muss daher permanent laufen und die wenigen (ca. 20-30/Tag) Befehle abarbeiten.


    Lief in der Vergangenheit über Firefox und MozRepl, aber teilweise mögen die Seiten Firefox nicht und für MozRepl mussten wir eine uralte FF-ESR-Version 52 am Leben erhalten, da MozRepl seit Jahren nicht mehr supported wird.


    Ob die neue Anwendung mit GUI läuft auch nicht (könnte ich ja minimieren oder für die User-Eingaben nutzen), ist eigentlich egal. _ShellChangeNotify getestet, scheint perfekt das zu sein was ich brauche, CPU-Last permanent 2% - ist nicht viel. Kommt vermutlich von der While-Schleife?


    Aber direkt eine Frage: Event 0x04000000, warum kommt da nicht der Text "Derzeit nicht verwendet", den ich im Script sehe?





  • Noch ein Verständnisproblem: wenn ich innerhalb des überwachten Ordners eine Textdatei mit Rechtsklick erzeuge oder diese dann innerhalb des Ordner kopiere, wird das nicht als "neu" angesehen?

    Mein erstes Programm bestand aus ca. 2.000 Lochkarten und nachdem sie mir das erste mal runtergefallen sind, habe ich die letzten beiden der 80 Byte für eine Numerierung benutzt :rofl:

  • Du hast da nichts falsch eingestellt. Es lag daran, dass ich mein SciTE auf UTF-8 umgestellt habe und das Encoding für Ausgaben von _ConOut für dich dann falsch waren.


    Ich habe es aber bereits in #Post 4 korrigiert und noch einige andere Dinge geändert!


    Aber direkt eine Frage: Event 0x04000000, warum kommt da nicht der Text "Derzeit nicht verwendet", den ich im Script sehe?

    Der kam nicht, weil $sFilePath = "" war:

    Das habe ich aber auch geändert...

  • Danke für die Hilfe, ist genau das was ich brauche. Kleines Problem noch:

    #include <_SplitPath.au3> wird nicht gefunden.

    Mein erstes Programm bestand aus ca. 2.000 Lochkarten und nachdem sie mir das erste mal runtergefallen sind, habe ich die letzten beiden der 80 Byte für eine Numerierung benutzt :rofl:

  • Danke für die Hilfe, ist genau das was ich brauche. Kleines Problem noch:

    #include <_SplitPath.au3> wird nicht gefunden.

    Ich mal wieder... total vergessen... habe das Archiv in #Post 4 korrigiert.


    _SplitPath() ist meine Alternative zu _PathSplit().


    Hier kann man sehen, warum:

    Noch ein Verständnisproblem: wenn ich innerhalb des überwachten Ordners eine Textdatei mit Rechtsklick erzeuge oder diese dann innerhalb des Ordner kopiere, wird das nicht als "neu" angesehen?

    Doch, sebstverständlich wird sie dann als neu angesehen... denn in beiden Fällen wurde ja eine neue Datei in dem zu überwachenden Ordner erzeugt, das "wie" ist dabei völlig egal.