Automatische controles uitvoeren met AdlibRegister in AutoIt

AutoIt: een kleine controle regelmatig laten lopen met AdlibRegister

Soms wil je in AutoIt niet alles in een grote lus stoppen. Je wilt alleen af en toe even kijken: is er al iets gebeurd? Daarvoor is AdlibRegister heel handig. Met deze functie laat je een kleine controle op vaste momenten draaien, zonder dat je hoofdscript vol raakt. https://www.autoitscript.com/autoit3/docs/functions/AdlibRegister.htm

Kort probleem

Stel, je script wacht op een bestand, een teken, of een andere simpele toestand. Dan kun je steeds blijven vragen: “is het er al?”. Als je dat met een grote lus doet, wordt je script snel rommelig.

AdlibRegister helpt hier. Je zet een functie klaar die AutoIt af en toe zelf aanroept. Zo kun je een kleine check doen, terwijl je hoofdscript gewoon doorloopt.

Dit doet de functie

AdlibRegister zet een functie op een timer. AutoIt roept die functie dan periodiek aan. Het is dus geen losse thread, maar een kleine vaste controle.

de twee functies die je hier nodig hebt zijn:

FunctieWat doet het
AdlibRegisterRegelt dat een functie af en toe wordt gestart
AdlibUnRegisterZet die periodieke aanroep weer uit

je geeft bij

AdlibRegister

de naam van je functie op. Vaak geef je ook een tijd in milliseconden door. Milliseconden zijn duizendsten van een seconde.

Wanneer heb je dit nodig?

Dit is handig als je script iets wil volgen zonder hard te blijven draaien in een eigen lus. Denk aan een simpele statuscheck. Of een klein stukje werk dat steeds even mag terugkomen.

Een goed praktijkvoorbeeld is een script dat wacht tot een bestand er is. In plaats van steeds zwaar te blijven controleren, laat je een kleine functie af en toe kijken.Zodra het bestand bestaat, stop je de controle weer.

Stap voor stap

1. Maak een kleine controlefunctie

Die functie moet klein zijn. Doe er alleen in wat je echt nodig hebt. In dit voorbeeld kijken we of een bestand bestaat.

2. Registreer die functie met AdlibRegister

Zo zeg je tegen AutoIt: voer deze functie elke zoveel milliseconden uit.

3. Laat je hoofdscript iets doen of wachten

Je hoofdscript kan gewoon doorlopen. De controlefunctie wordt tussendoor aangeroepen.

4. Zet de controle weer uit

Als je doel is bereikt, roep je AdlibUnRegister aan. Anders blijft de controle steeds terugkomen.

Voorbeeld met uitleg

Hier is een klein en echt bruikbaar voorbeeld. Het script wacht tot C:Tempklaar.txt bestaat. Intussen kijkt een Adlib-functie af en toe of dat bestand er al is.

Global $g_bKlaar = False
Global $g_sBestand = "C:Tempklaar.txt"

AdlibRegister("CheckBestand", 500)

While Not $g_bKlaar
    Sleep(100)
WEnd

AdlibUnRegister("CheckBestand")
MsgBox(64, "Klaar", "Het bestand is gevonden.")
Exit

Func CheckBestand()
    If FileExists($g_sBestand) then
        $g_bKlaar = True
    EndIf
EndFunc

Wat gebeurt hier?

  • Global $g_bKlaar = False

Dit is een vlag. Een vlag is gewoon een ja/nee-waarde.

False

betekent hier: nog niet klaar.

  • Global $g_sBestand = "C:Tempklaar.txt"

Dit is het bestand dat we zoeken.

  • AdlibRegister("CheckBestand", 500)

AutoIt roept

CheckBestand

elke 500 milliseconden aan. Dus twee keer per seconde.

  • While Not $g_bKlaar

Het hoofdscript wacht hier tot de vlag

True

wordt.

  • Sleep(100)

Kleine pauze. Zo vreet het script minder CPU. CPU is de rekenkracht van je computer.

  • AdlibUnRegister("CheckBestand")

Nu zetten we de periodieke aanroep uit. Klaar is klaar.

Praktijkvoorbeeld: wachten op een klaar-bestand

Dit patroon kom je vaak tegen. een ander programma schrijft eerst een bestand weg. Jouw script moet pas verder als dat bestand er echt staat.

Zonder AdlibRegister maak je vaak een eigen wachtrij of een grotere lus met veel checks. Dat kan wel, maar het wordt snel minder netjes. Met AdlibRegister houd je de check apart. Dat leest rustiger en is makkelijker aan te passen.

Je kunt ook andere kleine checks doen,zoals:

  • kijken of een venster al bestaat
  • kijken of een waarde in een tekstbestand is veranderd
  • kijken of een proces klaar is

De kern blijft steeds hetzelfde: een kleine functie die af en toe terugkomt.

Handige variant

Soms wil je niet alleen weten dat iets er is, maar ook wat doen zodra het gebeurt. Dan kun je in de controlefunctie meteen iets aanpassen en daarna stoppen.

Global $g_bGehaald = False

AdlibRegister("CheckStatus", 1000)

While Not $g_bGehaald
    Sleep(50)
WEnd

AdlibUnRegister("CheckStatus")
MsgBox(64, "Info", "Status is gevonden.")

Func checkstatus()
    ; hier zou je een echte check zetten
    $g_bGehaald = True
EndFunc

Dit laat hetzelfde idee zien. De functie komt steeds terug, maar alleen totdat de taak klaar is. Daarna zet je hem uit. Dat houdt je script schoon, als een beverdam die niet lekt 😉

Veelgemaakte fout

De grootste fout is dat de Adlib-functie te zwaar wordt. Zet er geen grote taak in. Doe er geen lang werk in met veel stappen. Hou het klein.

Nog een fout: vergeten AdlibUnRegister te gebruiken. Dan blijft de functie komen, ook als je hem niet meer nodig hebt. Dat kan later rare bijwerkingen geven.

Let ook op dit:

  • gebruik geen naam die al ergens anders op lijkt
  • zorg dat je functie snel klaar is
  • gebruik een duidelijke vlag of status, zodat je hoofdscript weet wanneer het kan stoppen

Bevers gedachte

AdlibRegister is handig als je een klein stukje controle geregeld wilt laten terugkomen. Niet alles hoeft in één lange lus. Soms is een korte check op vaste momenten genoeg.

De simpelste manier om het te onthouden is dit:

  • AdlibRegister = zet een kleine controle aan
  • AdlibUnRegister = zet hem weer uit

Als je script moet wachten, maar niet vast moet lopen in een grote lus, dan is dit een nette oplossing.