Abstrakt
Popis obsluhy událostí. Volně podle „Quartus Forth Manual“, Sleepless Night Wiki a dalších zdrojů.
Odkazy
Smyčka obsluhy událostí (Event Loop). je částí programu která vybírá (přijímá) události od PalmOs, a dále je zpracovává. Všechny programy musí mít tuto smyčku, aby jste se mohli přepnout do jiné aplikace. Nepotřebujete-li obsluhovat žádné události, můžete použít jednoduchou „prázdnou“ smyčku.
Aby se program choval standardně, musí mít obsluhu událostí, jinak by nešel ani ukončit.
Slovo ekey čeká na událost až 500ms. Chceme-li rychlejší smyčku můžeme použít slovo (ekey).
Příklad 15.4. Rychlejší *FIXME:smyčka/cyklus obsuhy událostí
: faster-event-loop ( -- ) begin 10. (ekey) ( → ekey) \ wait max of 100ms do-my-thing ( ekey → ekey ) drop ( ekey → ) again ;
Úsporná smyčka s „nekonečným“ čekáním.
: event-loop ( -- ) begin -1. (ekey) \ dispatch-event drop again ;
Hodnota -1. slova (ekey) přepne procesor do „doze mode“. Z hlediska našeho programu tento nedostane řízení, dokud nenastane nějaká událost. Rovněž není nikdy vrácena událost nilEvent.
V programu psaném v QuartusForth se nemusíte zajímat o obsluhu většiny událostí, Forth to udělá za vás, kdykoliv použijete KEY nebo EKEY. Automaticky jsou obsluhovány události
Systémové události (System events)
Menu (Menu events)
Nahrávání a otevírání formulářů (Form load and Form open events)
____________________ (Form event dispatching)
Události které nebyli obslouženy automaticky jsou vráceny na zásobník, kde je můžeme přečíst a obsloužit.
Základ obsluhy událostí vypadá takto
begin ekey drop again
Takováto obsluha ignoruje všechny události. Ve skutečnosti nejsou všechny události ignorovány ale řada z nich je obsloužena standardně.
Příklad 15.5. Ukázka kódu který reaguje na dotek pera
\ eh needs events : go ( -- ) begin ekey dup penDownEvent = if ." Pen Down detected" cr else dup penUpEvent = if ." Pen Up detected" cr then then drop again ;
Zajímavé je, jakým způsobem je ošetřena událost appStopEvent. Quartus Forth vám dává plnou kontrolu nad tím co se bude dít při ukončení programu. Když Quartus Forth obdrží appStopEvent, vygeneruje výjimku -257 THROW. Za normálních (běžných) okolností je tato výjimka ošetřena standardní obsluhou výjimek a program jednoduše skončí voláním příkazu (bye). Nicméně můžete tuto vájimku odchytit a zařídit si třeba úklid použitých prostředků před voláním (bye)
Příklad 15.6. Ukázka obsluhy
-257 constant byeThrow : go ( -- ) MainForm ." Go ahead, start another app." cr begin ['] key catch byeThrow = if ." Exiting in 5 seconds!" 500. SysTaskDelay (bye) then drop again ;
Tabulka 15.1. Seznam událostí (returned by EKEY) [1:3:7]
číslo | událost | popis |
---|---|---|
0 | nilEvent | žádná událost, nenastala žádná událost |
1 | penDownEvent | |
2 | penUpEvent | |
3 | penMoveEvent | |
4 | keyDownEvent | |
5 | winEnterEvent | |
6 | winExitEvent | |
7 | ctlEnterEvent | |
8 | ctlExitEvent | |
9 | ctlSelectEvent | |
10 | ctlRepeatEvent | |
11 | lstEnterEvent | tato událost v QF nenastane |
12 | lstSelectEvent | |
13 | lstExitEvent | |
14 | popSelectEvent | |
15 | fldEnterEvent | |
16 | fldHeightChangedEvent | |
17 | fldChangedEvent | |
18 | tblEnterEvent | |
19 | tblSelectEvent | |
20 | daySelectEvent | |
21 | menuEvent | |
22 | appStopEvent | |
23 | frmLoadEvent | |
24 | frmOpenEvent | |
25 | frmGotoEvent | |
26 | frmUpdateEvent | |
27 | frmSaveEvent | |
28 | frmCloseEvent | |
29 | frmTitleEnterEvent | |
30 | frmTitleSelectEvent | |
31 | tblExitEvent | |
32 | sclEnterEvent | tato událost v QF nenastane |
33 | sclExitEvent | |
34 | sclRepeatEvent | tato událost v QF nenastane |
32767 | firstUserEvent |