This is basically a discussion on how the Synchronous Application Manager module works. See it for more details.
As discussed in the Event-Driven Programming
tutorial, GETEVENT is the command that should be used to get
events. The Asynchronous I/O tutorial then showed
how to program for any sort of asynchronous I/O. It finished up by saying that
the two systems were completely incompatible!
The solution is to turn the GETEVENT command into just another
instance of asynchronous I/O. It then becomes possible to apply the general
asynchronous I/O framework to those events.
Where GETEVENT was used like:
LOCAL event%( 6 ) GETEVENT event%()
The asynchronous I/O version of it is:
LOCAL estat%, event%( 6 ) IOC( -2, 14, estat%, event%(), #0 )
It is otherwise identical to GETEVENT.
As a comparison:
| GETEVENT | Asynchronous I/O |
|---|---|
PROC mainloop:
GLOBAL done%
LOCAL a%( 6 ), keycode%, keymod%, keyrep%, syscmd$( 255 )
done% = 0
DO
GETEVENT a%()
IF ( a%( 1 ) AND $400 ) = 0
REM it's a keypress
keycode% = a%( 1 )
keymod% = a%( 2 ) AND $00FF
keyrep% = a%( 2 ) / 256
hdlKey:( keycode%, keymod%, keyrep% )
ELSEIF a%( 1 ) = $401
REM program has come to the foregound
ELSEIF a%( 1 ) = $402
REM program has gone to the background
ELSEIF a%( 1 ) = $403
REM machine has switched on
ELSEIF a%( 1 ) = $404
REM system command
syscmd$ = GETCMD$
hdlCmd:( LEFT$( syscmd$, 1 ), MID$( syscmd$, 2, 255 ) )
ELSEIF a%( 1 ) = $405
REM date has changed
ELSE
REM some unknown event (should never happen)
ENDIF
UNTIL done%
ENDP
REM Handle keypresses
PROC hdlKey:( keycode%, keymod%, keyrep% )
IF keycode% = 27
done% = 1 :REM allow main loop to exit
ELSE
REM do something with the key
PRINT REPT$( CHR$( keycode% ), keyrep% );
ENDIF
ENDP
REM Handle system command events
PROC hdlCmd:( syscmd$, sysfile$ )
IF syscmd$ = "X"
done% = 1 :REM allow main loop to exit
ENDIF
REM there are other "O" open and "C" close commands
REM - see the Programming Manual
ENDP
|
PROC mainloop:
GLOBAL done%
LOCAL a%( 6 ), keycode%, keymod%, keyrep%, syscmd$( 255 ), stat%
done% = 0
IOC( -2, 14, stat%, a%(), #0 )
DO
IOWAIT
IF stat% <> -46
IF ( a%( 1 ) AND $400 ) = 0
REM it's a keypress
keycode% = a%( 1 )
keymod% = a%( 2 ) AND $00FF
keyrep% = a%( 2 ) / 256
hdlKey:( keycode%, keymod%, keyrep% )
ELSEIF a%( 1 ) = $401
REM program has come to the foregound
ELSEIF a%( 1 ) = $402
REM program has gone to the background
ELSEIF a%( 1 ) = $403
REM machine has switched on
ELSEIF a%( 1 ) = $404
REM system command
syscmd$ = GETCMD$
hdlCmd:( LEFT$( syscmd$, 1 ), MID$( syscmd$, 2, 255 ) )
ELSEIF a%( 1 ) = $405
REM date has changed
ELSE
REM some unknown event (should never happen)
ENDIF
IF NOT done%
REM new event read
IOC( -2, 14, stat%, a%(), #0 )
ENDIF
REM could add in here ELSEIF tests on other status words
ENDIF
UNTIL done%
ENDP
REM Handle keypresses
PROC hdlKey:( keycode%, keymod%, keyrep% )
IF keycode% = 27
done% = 1 :REM allow main loop to exit
ELSE
REM do something with the key
PRINT REPT$( CHR$( keycode% ), keyrep% );
ENDIF
ENDP
REM Handle system command events
PROC hdlCmd:( syscmd$, sysfile$ )
IF syscmd$ = "X"
done% = 1 :REM allow main loop to exit
ENDIF
REM there are other "O" open and "C" close commands
REM - see the Programming Manual
ENDP
|