From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_05,INVALID_DATE autolearn=no autolearn_force=no version=3.4.4 Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!sol.ctr.columbia.edu!emory!gatech!udel!burdvax!wpllabs!loftus From: loftus@wpllabs.UUCP (William Loftus) Newsgroups: comp.lang.ada Subject: Re: Immediate Reading in Tasks Message-ID: Date: 19 Mar 91 03:19:46 GMT References: <739.27e1226c@vger.nsu.edu> Organization: WPL Laboratories List-Id: In article <739.27e1226c@vger.nsu.edu> g_harrison@vger.nsu.edu (George C. Harrison, Norfolk State University) writes: >Ada teachers and Real-Time types - > >Do-While Jones in "Ada in Action" proposes a solution similar to the following: > >Define a function KEYPRESSED (boolean) and an IGET procedure that only works >when KEYPRESSED is TRUE. These subroutines call a task which essentially holds >the incoming character as the value of a local [task] variable, setting >KEYPRESSED to true until the character is retrieved from the task. > >So another task might do this: > >loop > do_stuff; > if keypressed then > iget(ch); > do_something_with_ch; > else > do_something_else; > end if; >end loop; > >I welcome any and all ideas. I have used the Do-While Jones method, but it >seems to have a lot of overhead. It does have a lot of overhead. In many real-time systems the cost of executing "keypressed" is too much. If the call to keypressed is 100ms and you need to process a user typing (i.e. ~50 wpm) and other information you are devoting 1/2 sec/sec to processing keystrokes (these numbers come from a project that I am currently working on). Fortunately, keystrokes are often interrupts, and many Ada systems allow the mapping of interrupts to task entries. Using this approach the task (see below for a quick example) waits (allowing other tasks to execute) for a rendezvous from the system software and is not constantly polling for keystroke availability. task Keystroke is entry Key (Code : Byte); end Keystroke; task body Keystroke is Stroke : Byte; begin loop accept Key (Code : Byte) do Stroke := Code; end accept; Rest_Of_System.Process_Keystroke (Stroke); end loop; end Keystroke; -- William Loftus (215) 668 3661 WPL Laboratories, Inc. UUCP: loftus@wpllabs.UUCP P.O. Box 111 ARPA: loftus!wpllabs@prc.unisys.com 216 Wynne Lane Penn Valley, PA 19072 Ada and Unix Software Consultants