示例: 等待来自显示文件和 ICF 文件的输入
此示例显示了使用数据队列等待来自显示文件和 ICF 文件的输入的程序。

以下示例与数据队列的典型使用不同,因为只有一个作业。 数据队列充当作业中的通信对象,而不是两个作业之间的通信对象。
在此示例中,程序正在等待来自显示文件和 ICF 文件的输入。 数据队列用于允许程序在一个对象 (数据队列) 上等待,而不是交替地等待一个对象,然后等待另一个对象。 程序调用 QRCVDTAQ 并等待将项放在显示文件和 ICF 文件上指定的数据队列上。 两个文件指定相同的数据队列。 通过显示数据管理和 ICF 数据管理支持将两种类型的条目放在队列上 (当数据可从任一文件获取时)。 ICF 文件条目以 *ICFF 开头,显示文件条目以 *DSPF开头。
放在数据队列上的显示文件或 ICF 文件条目的长度为 80 个字符,并且包含以下列表中描述的字段属性。 因此,使用 CRTDSPF , CHGDSPF , OVRDSPF , CRTICFF , CHGICFF 和 OVRICFF 命令指定的数据队列的长度必须至少为 80 个字符。
- 位置 (和数据类型)
- 描述
- 1 到 10 (字符)
- 将条目放置在数据队列上的文件的类型。 此字段将具有以下两个值之一:
*ICFF表示 ICF 文件*DSPF表示显示文件
如果从数据队列接收数据的作业仅打开了一个显示文件或一个 ICF 文件,那么这是确定从数据队列接收到的项类型所需的唯一字段。
- 11 到 12 (二进制)
- 文件的唯一标识。 标识的值与文件的打开反馈区域中的值相同。 仅当数据队列上有多个同名文件将条目放在数据队列上时,从数据队列接收条目的程序才应使用此字段。
- 13 至 22 (字符)
- 显示文件或 ICF 文件的名称。 这是在处理所有覆盖后实际打开的文件的名称,并且与在文件的打开反馈区域中找到的文件名相同。 仅当有多个显示文件或 ICF 文件将项放置在数据队列上时,接收来自数据队列的项的程序才应使用此字段。
- 23 至 32 (字符)
- 文件所在的库。 这是处理完所有覆盖后库的名称,并且与在文件的打开反馈区域中找到的库名相同。 仅当有多个显示文件或 ICF 文件将项放置在数据队列上时,接收来自数据队列的项的程序才应使用此字段。
- 33 至 42 (字符)
- 处理所有覆盖后的程序设备名。 此名称与在开放式反馈区域的程序设备定义列表中找到的名称相同。 对于文件类型 *DSPF ,这是在其中按了命令或 Enter 键的显示设备的名称。 对于文件类型 *ICFF ,这是数据可用的程序设备的名称。 仅当将项放在数据队列上的文件在接收数据队列项之前邀请了多个设备或会话时,从数据队列接收该项的程序才应使用此字段。
- 43 至 80 (字符)
- 已保留。
以下示例显示了先前描述的程序可能使用的编码逻辑:
.
.
.
.
OPEN DSPFILE ... /* Open the Display file. DTAQ parameter specified on*/
/* CRTDSPF, CHGDSPF, or OVRDSPF for the file. */
OPEN ICFFILE ... /* Open the ICF file. DTAQ parameter specified on */
/* CRTICFF, CHGICFF, or OVRICFF for the file. */
.
.
DO
WRITE DSPFILE /* Write with Invite for the Display file */
WRITE ICFFILE /* Write with Invite for the ICF file */
CALL QRCVDTAQ /* Receive an entry from the data queue specified */
/* on the DTAQ parameters for the files. Entries */
/* are placed on the data queue when the data is */
/* available from any invited device or session */
/* on either file. */
/* After the entry is received, determine which file */
/* has data available, read the data, process it, */
/* invite the file again and return to process the */
/* next entry on the data queue. */
IF 'ENTRY TYPE' FIELD = '*DSPF ' THEN /* Entry is from display */
DO /* file. Since this entry*/
/* does not contain the */
/* data received, the data*/
/* must be read from the */
/* file before it can be */
READ DATA FROM DISPLAY FILE /* processed. */
PROCESS INPUT DATA FROM DISPLAY FILE
WRITE TO DISPLAY FILE /* Write with Invite */
END
ELSE /* Entry is from ICF */
/* file. Since this entry*/
/* does not contain the */
/* data received, the data*/
/* must be read from the */
/* file before it can be */
/* processed. */
READ DATA FROM ICF FILE
PROCESS INPUT DATA FROM ICF FILE
WRITE TO ICF FILE /* Write with Invite */
LOOP BACK TO RECEIVE ENTRY FROM DATA QUEUE
.
.
.
END