|
cobol400-l-request@xxxxxxxxxxxx wrote:
> 1. Re: Never Ending Program (Cesar Mendoza)
>
> Thank you for taking the time to share your opinions and suggestions.
> I've resolved my case using Local Data Area and changed the logical in
> the program to access the LDA when the flag is on. It's on when the cut of
> day occur.
Cesar:
I'm not clear on how the LDA will help, but I'll share another technique
anyway. I didn't see anything similar in other responses.
The following program is an example of a COBOL Never Ending Program (NEP) that
reacts immediately to a change in a 'date' field. The 'date' field is stored in
a user space and checked each time the NEP goes through another loop in its
processing. Another program can change the 'date' in the user space, and the
NEP will see it almost immediately.
My example uses an 11-byte user space. The first position is a control
character. The remaining 10 bytes is where the 'date' is stored. This control
character can be '0', '1' or 'E'. When it's '1', it means the 'date' has been
changed. When it's 'E', it means the NEP should end.
When the NEP sees a '1', it retrieves the new 'date'; it also changes the
control character from a '1' to a '0'. This change might tell another program
that the 'date' was retrieved.
You can submit the program to batch and test it this way:
==> call QUSCRTUS ('DATESPC mylib' 'DATEWORK ' +
x'0000000B' X'00' '*ALL ' +
'Test changing dates' '*YES ' +
x'0000000000000000' )
The space is created. Now put a value into it:
==> call QUSCHGUS ('DATESPC mylib' x'00000001' +
x'0000000B' '101/01/2004' '0')
Now, submit the NEP program to batch. Since the first character of the value is
a '1', the COBOL program will grab the next 10 bytes, '01/01/2004'. It should
run and do nothing but loop over and over. You can change it to do some work or
to delay a few seconds so it doesn't just use CPU cycles doing nothing.
After you're sure the program is running and will continue to run, execute this:
==> call QUSCHGUS ('DATESPC mylib' x'00000001' +
x'0000000B' 'E01/01/2004' '0')
This time there's an 'E' in the first position of the space value. As soon as
the NEP sees it, it should end. And it ought to happen pretty fast.
The example program:
----------------------------- Begin
PROCESS OPTIONS APOST
Identification Division.
Program-ID. AUTODATE.
Environment Division.
Configuration Section.
Source-computer. IBM-AS400.
Object-computer. IBM-AS400.
Data Division.
Working-storage Section.
01 WS-US-PTR pointer.
01 WS-US.
05 WS-US-NAME pic x(10) value 'DATESPC'.
05 WS-US-LIB pic x(10) value 'mylib'.
01 WS-US-ERR-DATA.
05 WS-US-PROVIDED pic s9(6) binary
value zero.
05 WS-US-AVAILABLE pic s9(6) binary
value zero.
05 WS-US-EXCEPTION-ID pic x(7).
05 WS-US-RESERVED pic x(1).
05 WS-US-EXCEPTION-DATA pic x(128).
01 Date-Area pic x(11).
01 Date-BrkDown redefines Date-Area.
05 Date-Cntl pic x(1).
05 Date-Fld pic x(10).
01 WS-SWITCHES.
05 END-Process-SW pic 1.
88 END-Process value b'1'.
88 MORE-Process value b'0'.
Linkage Section.
* These Linkage items will be pointed at the user space...
01 US-Date-Area pic x(11).
01 US-Date-BrkDown redefines US-Date-Area.
05 US-Date-Cntl pic x(1).
05 US-Date-Fld pic x(10).
Procedure Division
.
0000-SETUP.
*
* Get our user space pointer to track date changes...
*
call 'QUSPTRUS' using
WS-US
WS-US-PTR
*
* Link our date area to the space via the pointer...
*
set address of US-Date-Area to WS-US-PTR
set MORE-Process to true
.
0000-Process-Until-End.
*
* Perform until told to stop. When Date is changed, move
* the new date into working storage...
*
perform until END-Process
if US-Date-Cntl = 'E'
set END-Process to true
else
if US-Date-Cntl = '1'
move US-Date-Area to Date-Area
move '0' to US-Date-Cntl
else
* Do some work...
end-if
end-if
end-perform
goback
.
----------------------------- End
You can use the QUSCHGUS API to change the space or you can use QUSPTRUS in
another program just like in the example. You might want to establish and test
locks on the space in order to help guarantee that things happen in the order
you expect; just remember that user spaces can be accessed and changed
regardless of locks.
This can be a handy technique, a form of shared memory. Wish I had thought of
it, but it's a bright idea of a coworker, Gary.
Tom Liotta
--
Tom Liotta
The PowerTech Group, Inc.
19426 68th Avenue South
Kent, WA 98032
Phone 253-872-7788 x313
Fax 253-872-7904
http://www.powertech.com
__________________________________________________________________
New! Unlimited Netscape Internet Service.
Only $9.95 a month -- Sign up today at http://isp.netscape.com/register
Act now to get a personalized email address!
Netscape. Just the Net You Need.
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.