This example contains several examples of Asynchronous Input. Two methods may be used to detect the presence of asynchronous input, polling repeatedly or establishing an AST Handler that wakes a hibernating program. Polling may be accomplished either by repeatedly calling the Input request subprogram, or by initiating the request and then repeatedly calling the test input subprogram, recalling the original input request subprogram once input has been detected. This example program illustrates all methods.
C------------------- EXAMPLE 2 CODE ------------------------
PROGRAM EXAMPLE2
C
C Description:-
C =============
C Example Program to exercise UIPACK Asynchronous Input
C Subprograms.
C
C Global Declarations:-
C =====================
C
$$If VAX
Implicit None
$$Endif
$$Include 'UIPack$Library:UINames.Inc'
$$Include 'UIPack$Library:UIParam.Inc'
$$Include 'UIPack$Library:UIError.Inc'
C
C External Declarations:-
C =======================
C
EXTERNAL MYAST
C
C Local Declarations
C ==================
C
INTEGER INTVAL,STATUS,COUNT
CHARACTER*4 VERB
C
C Executable Code:-
C =================
C (1)
STATUS = UIINIT()
C (2)
STATUS = UIDFVB('GO')
STATUS = UIDFVB('PAUSE')
C (3)
STATUS = UIINMD(UIASYN)
STATUS = UINOIN
100 CONTINUE
IF (STATUS .EQ. UINOIN) THEN
STATUS = UIGTVB('Prompt,VERB)
IF (STATUS .EQ. UINOIN) THEN
CALL LIB$WAIT(0.1)
C (4)
GO TO 100
ENDIF
ENDIF
C (5)
IF (STATUS .EQ. UISUCC) THEN
IF (VERB .EQ. 'GO ') THEN
TYPE *,'Verb was ',VERB
GO TO 100
ELSEIF (VERB .EQ. 'PAUS') THEN
TYPE *,'Verb was ',VERB
ENDIF
ENDIF
C (6)
STATUS = UINOIN
110 CONTINUE
STATUS = UIGTVB('Prompt,VERB)
IF (STATUS .EQ. UINOIN) THEN
120 CONTINUE
CALL LIB$WAIT(0.1)
IF (UITSIN() .EQ. UINOIN) GO TO 120
C (8)
STATUS = UIGTVB('Prompt,VERB)
ENDIF
IF (STATUS .EQ. UISUCC) THEN
IF (VERB .EQ. 'GO ') THEN
TYPE *,'Verb was ',VERB
GO TO 110
ELSEIF (VERB .EQ. 'PAUS') THEN
TYPE *,'Verb was ',VERB
ENDIF
ENDIF
C (9)
COUNT = 0
STATUS = UINOIN
130 CONTINUE
IF (STATUS .EQ. UINOIN) THEN
STATUS = UIGTVB('Prompt,VERB)
IF (STATUS .EQ. UINOIN) THEN
CALL LIB$WAIT(0.1)
COUNT = COUNT + 1
IF (COUNT .LE. 10) GO TO 130
ENDIF
ENDIF
STATUS = UIGTMD(UISYNC)
STATUS = UIGTVB('Prompt,VERB)
C (10)
STATUS = UIINMD(UIASYN)
STATUS = UIGTMD(UIASYN)
STATUS = UINOIN
140 CONTINUE
IF (STATUS .EQ. UINOIN) THEN
STATUS = UIGTIN('Prompt,INTVAL)
IF (STATUS .EQ. UINOIN) THEN
CALL LIB$WAIT(0.1)
GO TO 140
ELSEIF (STATUS .EQ. UISUCC) THEN
TYPE *,INTVAL
GO TO 140
ENDIF
ENDIF
C (11)
STATUS = UIDFAS(MYAST)
STATUS = UINOIN
140 CONTINUE
IF (STATUS .EQ. UINOIN) THEN
STATUS = UIGTIN('Prompt,INTVAL)
IF (STATUS .EQ. UINOIN) THEN
CALL SYS$HIBER
GO TO 140
ELSEIF (STATUS .EQ. UISUCC) THEN
TYPE *,INTVAL
ENDIF
ENDIF
C (12)
STATUS = UIFINI()
STOP
END
SUBROUTINE MYAST
C (13)
CALL SYS$WAKE(,)
RETURN
END
C
C
C ----------------- END OF EXAMPLE 2 -----------------------
Notes: