WklTimerList
WklTimerList izvaja časovno načrtovane naloge za Accessov obrazec: iskanje, ki se začne 400 ms po zadnjem
pritisku tipke, števec, ki se osveži vsakih 30 sekund, čakalno vrsto spletnih zahtev, ki upošteva omejitev
podatkovne storitve. En kontrolnik vsebuje poljubno število nalog, vsaka s svojim ključem, zakasnitvijo,
intervalom in pravili za prekrivanja, ponovne poskuse in časovne omejitve. V pogledu načrta je viden, v pogledu
obrazca pa neviden.
Od izdaje 1.60.0. Na voljo sta vrsti wttEvent in wttHttp; wttSteps, wttFile, wttChecksum, wttZip in wttProgram so del pogodbe, vendar jih ta različica zavrne z wkeNotAvailable.
Prvi koraki
- Iskanje po seznamu med tipkanjem: zakasnjeno iskanje in števec, ki se osveži vsakih 30 sekund.
Pogosta opravila
- Začetek iskanja 400 ms po zadnjem pritisku tipke: ena naloga z
Delay = 400,Restartv dogodkuChangepolja z besedilom. - Osveževanje števca vsakih 30 sekund: ena naloga z
Interval = 30000,AutoStart = True. - Pošiljanje 1.700 zahtev storitvi, ki jih dovoli 300 na minuto: ena naloga vrste
wttHttpzRateLimit = 300,RateWindow = 60000, enRequests.Addna vrstico s ključem vrstice kotTag(Pošiljanje velikega števila zahtev spletni storitvi v njenem tempu).
Grafični prikaz
graph TD
A[Obrazec se odpre] --> B{AutoStart}
B -->|True| C[Naloge čakajo]
B -->|False| D[Naloge ustavljene do Start]
D --> C
C -->|na vrsti, wttEvent| E[TaskDue poslan obrazcu]
E -->|procedura se je končala| C
C -->|na vrsti, wttHttp| F[Čakalna vrsta pošlje svoje zahteve]
F -->|vsak odgovor| R[RequestCompleted ali RequestFailed]
R --> F
F -->|čakalna vrsta prazna| G[TaskCompleted]
G -->|Interval večji od 0| C
X[Obrazec se zapre] --> J[Vse naloge se končajo, nobenega dogodka več]Ključne zmožnosti
- Več nalog na obrazec, vsaka določena s ključem; zaganjate, ustavljate, začasno ustavljate in nadaljujete jih lahko posamično ali vse skupaj.
- Prvi čas izvedbe po zakasnitvi od zagona ali ob določeni uri.
- Ponavljanje v stalnem intervalu, ki se šteje od časa izvedbe, ne od konca izvajanja: 2-sekundno izvajanje ne zamakne 30-sekundnega niza.
- Pravilo prekrivanja za čase izvedbe, ki minejo, medtem ko izvajanje še poteka: zavrže jih (
wtoSkip) ali ohrani natanko enega (wtoOnce). Čakalna vrsta nikoli ne raste. - Ponovni poskusi in časovne omejitve za vsako nalogo.
- Vrste dela: dogodek VBA (
wttEvent), VBA v korakih (wttSteps) in opravila, ki jih kontrolnik sam izvaja v ozadju: spletna zahteva (wttHttp), kopiranje ali premikanje datotek (wttFile), kontrolna vsota (wttChecksum), ZIP (wttZip), zunanji program (wttProgram). - Spletne zahteve v nadzorovanem tempu: najmanjši razmik, omejitev na časovno okno, premor, ko storitev odgovori s 429, in zaustavitev celotne čakalne vrste ob 401, dokler se aplikacija znova ne prijavi.
Osnovni pojmi
Časovnik ne omogoči vzporednega izvajanja VBA. VBA, obrazci, DAO in objektni model programa Access tečejo v glavni niti
programa Access. Naloga wttEvent ali wttSteps se izvede v tej niti, ko je na vrsti; drugje tečejo samo vrste v
ozadju, njihovi rezultati pa se vrnejo v glavno nit kot dogodki.
Dogodki se pošljejo, nikoli se ne sprožijo iz drugega dogodka. VBA ne posreduje dogodka objekta, medtem ko se
izvaja dogodkovna procedura istega objekta. Kontrolnik zato vsak dogodek, ki je na vrsti, pošlje v lastno okno za
sporočila in ga posreduje, ko se trenutna procedura konča. MsgBox v dogodkovni proceduri naslednji dogodek
zakasni, ne izgubi pa ga.
Lastno okno za sporočila. Kontrolnik ActiveX, ki je v programu Access neviden ali onemogočen, nima okna in ne
prejema sporočil. Seznam časovnikov zato uporablja skrito okno samo za sporočila, ki živi od odprtja do zaprtja obrazca, ne glede na vrednosti Visible in Enabled.
Življenje naloge se konča z obrazcem. Ko se obrazec zapre, se vse naloge ustavijo, opravila v ozadju, ki tečejo, se prekličejo, in noben dogodek ne pride več.
Ura. Zakasnitve in intervali se štejejo na monotonem števcu, zato uporabnik, ki uro sistema Windows premakne
naprej ali nazaj, ne povzroči, da bi se naloga sprožila prezgodaj ali prepozno. StartAt je lokalni čas.
Pravila
Ta pravila določajo, kdaj je naloga na vrsti. Za vse vrste nalog so enaka.
| Položaj | Vedenje |
|---|---|
Start z Delay = 0 in brez StartAt | Takoj na vrsti. |
StartAt v prihodnosti | Na vrsti ob tem času. |
StartAt v preteklosti, Interval = 0 | Takoj na vrsti. |
StartAt v preteklosti, Interval > 0 | Na vrsti ob naslednjem času niza StartAt + n × Interval po trenutnem času. |
Izvajanje končano, Interval > 0 | Naslednji čas izvedbe = prejšnji čas izvedbe + Interval. |
Izvajanje končano, Interval = 0 | Stanje wtsDone. |
Med izvajanjem so minili časi izvedbe, wtoSkip | Zavržejo se; naslednji čas izvedbe je naslednji čas niza po trenutnem času. |
Med izvajanjem so minili časi izvedbe, wtoOnce | Takoj sledi ena izvedba; drugi se zavržejo. |
Trigger med izvajanjem, wtoOnce | Zabeleži se ena dodatna izvedba; nadaljnji sprožilci ne dodajo novih. |
Trigger med izvajanjem, wtoSkip | Prezre se. |
Izvajanje ni uspelo, ponovni poskusi (Retries) so še na voljo | Ista izvedba (isti RunId) se ponovi po RetryDelay; TaskFailed z WillRetry = True. |
| Izvajanje ni uspelo, ponovnih poskusov ni več | TaskFailed z WillRetry = False; LastError ohrani besedilo; niz se nadaljuje, če je Interval > 0. |
| Izvajanje preklicano | Nikoli se ne ponovi. |
Izvajanje traja dlje od Timeout | Opravila v ozadju: poskus se prekliče (pri čakalni vrsti spletnih zahtev: za vsako zahtevo posebej, glejte spodaj). Izvedba wttEvent je dogodkovna procedura VBA in je ni mogoče prekiniti; Timeout nanjo ne vpliva. |
Pause | Preostali čas se ohrani; Resume nadaljuje z njim. |
Stop med izvajanjem | Izvajanje se konča običajno; nič več se ne načrtuje, zabeležena izvedba ne sledi. |
Restart | Zakasnitev se začne znova od zdaj: zakasnjeno iskanje po vsakem pritisku tipke. |
Enabled = False | Nikoli na vrsti, tudi ne ob Trigger. |
Pravila za spletne zahteve (wttHttp). Naloga te vrste je čakalna vrsta: vsebuje poljubno število zahtev,
pošilja jih eno za drugo in za vse skupaj upošteva spodnji tempo.
| Položaj | Vedenje |
|---|---|
MinGap | Najkrajši čas med začetkoma dveh zahtev čakalne vrste. |
RateLimit, RateWindow | Največ RateLimit začetkov v katerem koli obdobju RateWindow milisekund. Obe lastnosti je mogoče nastaviti v poljubnem vrstnem redu; Start čakalne vrste z RateLimit, a brez RateWindow, se zavrne z wkeInvalidValue. |
Odgovor 429 z Retry-After | Celotna čakalna vrsta se za ta čas ustavi (sekunde ali datum HTTP, RFC 9110, razdelek 10.2.3); daljši premor, ki je že nastavljen, ostane. QueuePaused sporoči razlog in konec. Zahteva se pošlje znova. |
Odgovor 429 brez Retry-After | Kot zgoraj, za RateWindow milisekund; brez RateWindow za 60 sekund. |
| Odgovor 401 | Celotna čakalna vrsta se zaustavi; sporoči to samo QueueHalted, s stanjem in glavami odgovora. Aplikacija se v glavni niti znova prijavi, nastavi skupne glave in pokliče Resume; zaustavljena zahteva se pošlje znova prva. |
| Drugi zaporedni odgovor 401 za isto zahtevo | RequestFailed zanjo (da neuspela prijava ne teče v zanki), čakalna vrsta pa se z QueueHalted znova zaustavi. |
| Brez odgovora (prekinjena povezava, časovna omejitev) | Dokler so ponovni poskusi (Retries) na voljo, se zahteva po RetryDelay pošlje znova, pred vsemi drugimi čakajočimi zahtevami. |
Timeout, Retries, RetryDelay | Veljajo za vsako zahtevo in vsak poskus, ne za celotno čakalno vrsto. |
| Kateri koli drug odgovor, tudi 5xx | Sporoči se z RequestFailed, nikoli se ne pošlje znova: ponovitev bi lahko delo opravila dvakrat. |
| Ponovitev | Pošlje iste lastne glave, isto telo in isti Idempotency-Key. Skupne glave se preberejo ob vsakem pošiljanju, zato nova glava seje po odgovoru 401 velja zanjo in za vse zahteve, ki še čakajo. |
Stop | Nič več se ne pošlje. Zahteva, ki je na poti, se ne prekliče: njen odgovor pride in se sporoči, ker lahko zaprta povezava v storitvi pusti spremembo, katere izida nihče ne pozna. Zahteve, ki še niso poslane, ostanejo v stanju wrsWaiting, brez dogodka. Start jih pošlje. |
Requests.Clear ali Request.Cancel | Vsaka zahteva, ki še ni končana, se konča z RequestCancelled in stanjem wrsCancelled; zahtevi na poti se povezava zapre in se nikoli ne pošlje znova. Njen izid v storitvi ni znan: če storitev to podpira, jo sami znova pošljite z istim IdempotencyKey. |
| Več čakalnih vrst za isto storitev | Tempa si ne delijo: vsaka upošteva svoj MinGap in RateLimit. Vse zahteve za eno storitev postavite v eno čakalno vrsto, na primer na obrazcu lupine. |
| Čakalna vrsta je prazna | TaskCompleted z Result = Array(completed, failed), številom zahtev, ki so se v tem izvajanju dokončno končale uspešno oziroma neuspešno. Nove zahteve, dodane pozneje, čakalno vrsto znova zaženejo, dokler je naloga zagnana. |
Kodiranje, prijava in skrivnosti:
| Tema | Pravilo |
|---|---|
| Telo zahteve | Pošlje se kot UTF-8 s ContentType zahteve (privzeto application/json; charset=utf-8). |
| Besedilo odgovora | Result.Text se dekodira po charset odgovora; če ga ni, kot UTF-8. |
| Prijava Windows | UseWindowsLogin = True se prijavi z računom Windows procesa Access (Negotiate, NTLM), ko storitev to zahteva. Privzeto False. |
| Skrivnosti | Skupne glave, lastne glave ter telesa zahtev in odgovorov ostanejo samo v pomnilniku. Sled in besedila napak navajajo metodo, naslov brez poizvedbenega dela in stanje; nikoli vrednosti glave ali telesa. |
Pogodba
WklTimerList (kontrolnik) z zbirko Tasks objektov WklTimerTask.
Član WklTimerTask | Pomen |
|---|---|
Key | Enolično besedilo, pri primerjavi se velike in male črke ne razlikujejo. |
Enabled | Naloga sodeluje. |
Kind | wttEvent, wttSteps, wttHttp, wttFile, wttChecksum, wttZip, wttProgram. |
Delay, StartAt | Prvi čas izvedbe: milisekunde po Start ali ura. |
Interval | Ponavljanje v milisekundah; 0 = enkrat. |
Overlap | wtoSkip ali wtoOnce. |
Timeout, Retries, RetryDelay | Časovna omejitev izvajanja (0 = brez), ponovni poskusi po napaki, čakanje pred ponovnim poskusom. |
Tag | Poljubna vrednost; nespremenjena se posreduje vsakemu dogodku. |
State | wtsStopped, wtsWaiting, wtsRunning, wtsPaused, wtsDone (samo za branje). |
RunCount, LastRun, NextRun, LastError | Samo za branje. |
Start, Stop, Pause, Resume, Trigger, Restart | Glejte Pravila. |
Član WklTimerList | Pomen |
|---|---|
Tasks | Naloge; Add(Key), Remove(Key), Item(Key), Count. |
Start, Stop, Pause, Resume | Za vse naloge. |
AutoStart | Zažene vse naloge, ko se obrazec odpre. |
Running | Število izvajanj, ki potekajo. |
MaxParallel | Hkratna opravila v ozadju; privzeto 1. Rezervirano za vrste za datoteke, kontrolne vsote, ZIP in programe; vsaka čakalna vrsta spletnih zahtev vedno pošilja po eno zahtevo naenkrat, več čakalnih vrst pa teče vzporedno. |
| Dogodek | Kdaj |
|---|---|
TaskDue(Key, RunId, Tag, Cancel) | Izvedba wttEvent je na vrsti; dogodkovna procedura je izvedba. Cancel = True jo preskoči; niz se nadaljuje. Čakalna vrsta spletnih zahtev namesto tega sproži TaskStarted, s svojo prvo zahtevo. |
TaskStep(Key, RunId, Step, Done, Progress) | Samo wttSteps: enkrat na korak; Access med koraki dobi nadzor nazaj. |
TaskStarted(Key, RunId) | Opravilo v ozadju se je začelo. |
TaskProgress(Key, RunId, Percent, Text) | Opravilo v ozadju sporoča napredek. |
TaskCompleted(Key, RunId, Result) | Izvajanje v ozadju se je uspešno končalo; pri čakalni vrsti spletnih zahtev je čakalna vrsta postala prazna. Izvedba wttEvent ga ne sproži: njena izvedba je TaskDue. |
TaskFailed(Key, RunId, Number, Description, WillRetry) | Izvajanje ni uspelo. |
TaskCancelled(Key, RunId, Reason) | Izvajanje je bilo preklicano (s Stop opravila v ozadju, s časovno omejitvijo, z zaprtjem obrazca). |
Result po vrstah: datoteke in ZIP Files, Bytes; kontrolna vsota Hash; program ExitCode, Output,
ErrorOutput.
Čakalna vrsta spletnih zahtev
Člani WklTimerTask vrste wttHttp:
| Član | Pomen |
|---|---|
Requests | Zahteve čakalne vrste; Add(Method, Url, [Body], [Tag], [ContentType]) As WklHttpRequest, Item(Id), Count (tudi končane), Waiting (še ne poslane), Clear, Forget (odstrani končane zahteve in vrne njihovo število). |
SharedHeader(Name) | Branje in pisanje glave, ki se pošlje z vsako zahtevo čakalne vrste, na primer X-Api-Key, Authorization ali glava seje drugega faktorja. Prazna vrednost glavo odstrani. |
MinGap, RateLimit, RateWindow | Tempo, glejte Pravila. |
UseWindowsLogin | Prijava z računom Windows, glejte zgoraj. |
Halted, PausedUntil | Samo za branje: čakalna vrsta po odgovoru 401 čaka na Resume; konec premora po odgovoru 429 ali Null. |
Člani WklHttpRequest:
| Član | Pomen |
|---|---|
Id | Številka zahteve, enolična v nalogi; posreduje se vsakemu dogodku zahteve. |
Method, Url, Body, ContentType | Kot so bili podani metodi Add; spremenljivi, dokler zahteva ni poslana. |
Header(Name) | Lastna glava te zahteve. |
IdempotencyKey | Pošlje se kot Idempotency-Key; privzeto nov GUID, enak za vsako ponovitev. Pri prazni vrednosti se ne pošlje. |
Tag | Poljubna vrednost; nespremenjena se posreduje vsakemu dogodku zahteve, na primer ključ vrstice. |
State | wrsWaiting, wrsSending, wrsCompleted, wrsFailed, wrsCancelled. |
Cancel | Konča zahtevo: če še ni poslana, se odstrani iz čakalne vrste; če je na poti, se povezava zapre. |
Dogodki čakalne vrste (poleg zgornjih dogodkov naloge):
| Dogodek | Kdaj |
|---|---|
RequestCompleted(Key, Id, Tag, Status, Result) | Prispel je odgovor 2xx ali 3xx. Result: Status, Text, Header(Name), Headers. Tu je mogoče dodati še več zahtev. |
RequestFailed(Key, Id, Tag, Status, Description, WillRetry, Result) | Drug odgovor ali brez odgovora; Status je 0, če odgovora ni bilo. Result vsebuje odgovor (Text, Header(Name)), če je prišel, na primer sporočilo problem+json; sicer Nothing. |
RequestCancelled(Key, Id, Tag, Reason) | Zaradi Cancel, Requests.Clear, časovne omejitve ali zaprtja obrazca. |
QueuePaused(Key, Reason, ResumeAt) | Odgovor 429 je čakalno vrsto ustavil do ResumeAt (lokalni čas). |
QueueHalted(Key, Id, Status, Headers) | Odgovor 401 je čakalno vrsto zaustavil; Headers vsebuje glave odgovora kot besedilo. |
QueueResumed(Key) | Premor se je končal ali pa je bil poklican Resume. |
Skrbništvo
Odpravljanje težav
Zaenkrat ni strani.
Za razvijalce
Sorodne teme
- WklApplication: aplikacija kot celota, v kateri živi obrazec lupine s svojimi časovniki.