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
next prev parent 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