comp.lang.ada
 help / color / mirror / Atom feed
From: Jeffrey Carter <jrcarter@acm.org>
Subject: Re: On-Screen Elapsed Time Display?
Date: Fri, 11 Oct 2002 19:32:20 GMT
Date: 2002-10-11T19:32:20+00:00	[thread overview]
Message-ID: <3DA72766.2010907@acm.org> (raw)
In-Reply-To: M7Fp9.19408$T_.451626@iad-read.news.verio.net

Dr Nancy's Sweetie wrote:
> I searched Google a few times for this, and didn't seem to find it,
> but maybe I just couldn't think of the Right Magic Keywords.  So
> this is probably a stupid newbie question that's been answered 100
> times.  (Maybe the next person to search on the keywords I came up
> with will find this article and the helpful replies.)
> 
> I have written a game, and thought it might be more interesting with
> "best times" file, so people can compete with each other.  It's
> easy enough to add in something like this:
> 
>    type Time_T is new Long_Integer;
>    Start_Time, Win_Time: Time_T;
>    procedure Time ( Time : in out Time_T);
>    pragma Import (C, Time);

You could also use Ada.Calendar (or Ada.Real_Time if that's not accurate 
enough :).

> 
> and then set Win_Time when the player wins, subtract, and figure out
> how long it took.
> 
> What I don't see easily (and maybe I'm just blind) is a good way to
> get a display on the screen (the game uses ncurses) during play.
> I can update the clock every time someone pushes a key, of course,
> but that's kinda lame.
> 
> What I probably need is some Ada version setitimer().  Then it's
> just a matter of set up a function that displays the clock, hook the
> function to SIGALRM, and set the timer to 900ms.  I found the pragma
> "Attach_Handler", and also found SIGALRM in Ada.Interrupts.Names.
> But what's the Ada equivalent of "setitimer();"?
> 
> I can import setitimer(), and make Ada versions of struct timerval
> and itimerval, but that's starting to feel like I'm overusing C,
> and depending on Unixisms (which is bad for portability).
> 
> What is the Right Thing to do?  I'm using GNAT, if that makes any
> difference.

Maybe you want another task that updates the time display every so often 
using "delay until". Then, of course, you have 2 tasks writing to the 
display, so you need to protect it, but that's simple enough. Create a 
protected queue on which tasks can put Strings to be displayed and the 
position at which to display them, then have a 3rd task that takes 
things off this queue and does the display. Have the queue block the 
display task if the queue is empty.

When dealing with an inherently concurrent problem, things are usually 
simpler if you use high-level concurrency constructs.

-- 
Jeff Carter
"Death awaits you all, with nasty, big, pointy teeth!"
Monty Python & the Holy Grail




  reply	other threads:[~2002-10-11 19:32 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-10-11 18:54 On-Screen Elapsed Time Display? Dr Nancy's Sweetie
2002-10-11 19:32 ` Jeffrey Carter [this message]
2002-10-14 21:36   ` Dr Nancy's Sweetie
2002-10-14 23:05     ` tmoran
2002-10-16  1:45       ` Dr Nancy's Sweetie
2002-10-15 19:23   ` Dr Nancy's Sweetie
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox