The RECEIVE statement retrieves messages sent by other threads.
General Format
RECEIVE dest-item FROM { THREAD thread-1 }
{ LAST THREAD }
{ ANY THREAD }
Remaining phrases are optional, can appear in any order.
{ BEFORE TIME timeout }
{ WITH NO WAIT }
THREAD IN thread-2
SIZE IN size-item
STATUS IN status-item
[ ON EXCEPTION statement-1 ]
[ NOT ON EXCEPTION statement-2 ]
[ END-RECEIVE ]
Syntax Rules
- dest-item is any data item.
- thread-1 and
thread-2 are usage HANDLE or HANDLE OF THREAD data items.
thread-2 may not be indexed or reference modified.
- timeout is a numeric literal or data item.
- size-item is a numeric data item. It may not be indexed or reference modified.
- status-item is a two-character group item, PIC XX, or PIC 99 data item. It may not be indexed or reference modified.
- statement-1 and
statement-2 are any imperative statements.
General Rules
- The RECEIVE statement returns the next available message into dest-item. Only messages from the proper source are allowed
as follows:
- FROM THREAD
thread-1 specifies that only messages from the thread identified by
thread-1 are allowed.
- FROM LAST THREAD specifies that only messages from the last thread are allowed. See
Thread Fundamentals for more information.
- FROM ANY THREAD specifies that all messages are allowed.
- Messages are received in the order sent. If a message is available when the RECEIVE statement executes, the RECEIVE statement
finishes immediately. Otherwise, the RECEIVE statement waits for a message to become available. This provides an efficient
method for threads to synchronize with each other.
- When BEFORE TIME is specified, the RECEIVE statement will time out after the specified (timeout) number of hundredths of seconds.
If the RECEIVE statement times out before receiving a message, it terminates with an exception condition and does not modify
dest-item,
thread-2, or
size-item. If timeout is zero, then the RECEIVE statement times out immediately if a message is not available. Specifying NO WAIT is
equivalent to specifying a timeout value of zero.
- If no message is available and the sending thread (as specified by rule1 above) does not exist or terminates before sending
a message, the RECEIVE statement terminates with an exception condition and does not modify dest-item or
size-item. This condition is reflected in the status placed in
status-item. Note that the test occurs before the time-out test in the case that timeout is zero or NO WAIT is specified.
- The RECEIVE statement places the thread ID of the sending thread in
thread-2.
- The size of the message sent is placed in
size-item. The size is expressed in standard character positions (bytes). If the message is longer than
dest-item, it is truncated. If the message is shorter than
dest-item, it is padded on the right with spaces.
- The status of the RECEIVE statement is placed in
status-item. The following values are possible (these approximate the standard file status codes):
"00"
|
Success - message received
|
"04"
|
Success - message received, but it was truncated
|
"10"
|
Exception - sending thread does not exist or terminated
|
"99"
|
Exception - timed out
|
- If the RECEIVE statement is successful (as indicated in rule 7 above),
statement-2 executes. If an exception condition is returned,
statement-1 executes.