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:
| Functie | Wat doet het |
|---|---|
AdlibRegister | Regelt dat een functie af en toe wordt gestart |
AdlibUnRegister | Zet 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 aanAdlibUnRegister= zet hem weer uit
Als je script moet wachten, maar niet vast moet lopen in een grote lus, dan is dit een nette oplossing.
