× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



Hi Phil,

As well, we have a situation where the users sometimes hold a session w/
a particular program. However, in the past, they have not been able to
use the system values that pertain to ending sessions after a certain
time has passed and a key was not hit.

Hmmm... there's no way to tell whether a key was hit. The system sends data to a terminal a full screen at a time. It then lets the terminal take care of all the editing of the data on the screen. The system doesn't receive control again until an AID-generating key is pressed, such as ENTER or a F-key, etc.

I'm sure you've encountered this behavior already.

If you want, you can perform a timeout when no AID-generating key has been pressed for 30 minutes. Or whatever time limit you prefer. But there's no way to do it based on whether any key has been pressed (that is, short of writing your own emulator, and adding that functionality to the emulator itself.)

I know of 3 different ways to wait until a timeout has occurred on a screen, and have the program resume control:

a) The WAITRCD keyword for the CRTDSPF command.

b) Attach a data queue to the display file, write the display with the INVITE keyword, and wait for a data queue entry before reading the display. Since data queues can time-out, this lets you check for a timeout.

c) Schedule the system to send an alarm signal (with the alarm() API) and set up a subprocedure that's called automatically when a signal is received. Then display the screen as normal. If a signal is received, a timeout has occurred, so use an *ESCAPE message to cancel the screen.


There are pros and cons to each method.  Here are my experiences:


Method A works okay, but has some drawbacks:

    -- You have to code MAXDEV(*FILE) on the F-spec, and always read
          the file with the READ op-code by FILE (not record format)
          name.

    -- You have to code an OVRDSPF to override WAITRCD before opening
          the display file (or before the program starts) -or- you
          to remember to type the WAITRCD parameter every time you
          rebuild the display file (I prefer the OVRDSPF method so
          I can't forget to specify the keyword.)

    -- Each time a timeout occurs, the user will see it. Input inhibited
          will go on until the screen is read again.  For what you're
          doing, this won't matter. But, if you wanted to (for example)
          check %SHTDN every 5 seconds, this would be very annoying.


Method B works very nicely as well, however:

    -- You still have to OVRDSPF before displaying the screen, but now you
          specify a data queue to attach to instead of WAITRCD

    -- The data queue has to be built first.

    -- You still have to use READ/WRITE instead of EXFMT, but you can use
           the record format name if you prefer.

    -- You have to call the data queue APIS, which might add complexity.

    -- Since the program is waiting on the data queue and not the display
          file, you have problems if the user turns the terminal off or
          loses communications before exiting the screen.  The program
          doesn't know that the user has disconnected, since it's not
          waiting for the screen, it's waiting for the data queue.

    -- Unlike method A, this method is invisuble to the user until you
          display another screen or close the display file and cause the
          screen to change.

Method C is much more unconventional, but it's the one I prefer.

    -- No special display file coding. You can use EXFMT as always.

    -- It doesn't interrupt the screen until you display something
          different. This makes it suitable for checking %SHTDN in
          a loop.  (Using an interval timer, for example.)

    -- Since the program is still waiting on the EXFMT, it still receives
          errors if the user disconnects.

    -- You have to use the Unix-type APIs alarm(), setitimer() and
          sigaction() which can add complexity, though I generally
          find the Unix-type APIs to be much easier to read than the
          i5/OS APIs.

    -- Have to call the QMHSNDPM API to send the *ESCAPE message, and
          have to have some knowledge of how escape messages work.


As an Amazon Associate we earn from qualifying purchases.

This thread ...

Follow-Ups:
Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 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.