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 |