comp.lang.ada
 help / color / mirror / Atom feed
From: "David C. Hoos" <david.c.hoos.sr@ada95.com>
Subject: Re: gnat: time-slicing
Date: Mon, 15 Jul 2002 12:16:17 -0500
Date: 2002-07-15T12:16:17-05:00	[thread overview]
Message-ID: <mailman.1026753422.20321.comp.lang.ada@ada.eu.org> (raw)
In-Reply-To: pan.2002.07.15.16.20.47.38263.1135@gmx.net


----- Original Message -----
From: "Jan Prazak" <janp9@gmx.net>
Newsgroups: comp.lang.ada
To: <comp.lang.ada@ada.eu.org>
Sent: Monday, July 15, 2002 2:10 PM
Subject: Re: gnat: time-slicing


<snip>
> Where should this be placed? This looks like the suggestions from David,
> he suggested "Delay 0.02" after each Put_Line, but it gives not the
> result I want.
What result did it give?

When I ran your program on my RedHat 6.2 box with dual 1.0 gHz. processors,
it gave the result you wanted.

When I ran it on my Win2K box with one 1.8 gHz. processor, it gave the reult
a
a
b
b

When I added the suggested delay statements, it gave the result
b
a
b
a

which interleaves the actions of the tasks, but with Task_A beginning
execution before the main program.

There is no way your program can be deterministic over different
OSs, and hardware platforms.  Time slicing will not do it either.

>
> Think of a timer:
>
> task Timer is ...
> ...
> loop
>   Delay 1.0;
>   Put(current_time);
> end loop;
> ...
>
> The task uses one Put, which puts current time somewhere on the screen.
> And this task has to be completely independent from other tasks (= main
> procedure). There has to be a way to do this with gnat, and that's also
> my question. I don't want to slow down other tasks with "Delay", just to
> let Timer-task do the next step (for example when doing some difficult
> computing, maybe array-sorting or similar things), so there has to be a
> "direct" way (like a pragma).
This restatement of what you want to do is completely different from what
you described in your original post.

If I understand what you want is a task that will run once per some time
interval
independently of the other task(s).

Here is an example of how that can be done:

   Interval : constant Duration := 1.0;
   use type Ada.Calendar.Time;
   Next_Time : Ada.Calendar.Time :=
       Ada.Calendar.Clock + Interval;
begin
    loop
        Delay until Next_Time;
        Next_Time := Next_Time + Interval;
        ......
   end loop;


Since delays are for a _minimum_ of the specified time, using a simple
delay statement in a "timer" will result in an accumulation of time error.

What I have shown above will put the task on the ready queue for its
priority at precisely Interval-second intervals without accumulation of
time errors.

However, just how soon after the task becomes ready it will actually
run depends on what other tasks are running, their priorities relative to
the priority of the "timer" task, and whether these other tasks are
"civilized" about yielding the CPU from time-to-time if they are compute-
intensive.

For example, if you have a compute-intensive task that executes a
delay 0.0 statement no time will be lost if there is no other task ready
to run.  But, when your timer task is ready, and is of a higher priority,
it will run when given the opportunity.






  reply	other threads:[~2002-07-15 17:16 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-07-15 11:25 gnat: time-slicing Jan Prazak
2002-07-15  8:44 ` Dale Stanbrough
2002-07-15 19:10   ` Jan Prazak
2002-07-15 17:16     ` David C. Hoos [this message]
2002-07-15 23:30       ` Jan Prazak
2002-07-16  0:54         ` Jan Prazak
2002-07-16 10:46         ` Lutz Donnerhacke
2002-07-16 11:57           ` Aaro Koskinen
2002-07-16 12:57           ` SteveD
2002-07-16 15:18           ` Florian Weimer
2002-07-16 13:29     ` Marin David Condic
2002-07-17 19:29       ` Jan Prazak
2002-07-15 13:07 ` time-slicing David C. Hoos
2002-07-15 14:56   ` time-slicing Ian Broster
2002-07-15 19:10   ` time-slicing Jan Prazak
2002-07-15 19:10   ` time-slicing Jan Prazak
2002-07-15 19:05     ` time-slicing Anders Gidenstam
2002-07-15 23:30       ` time-slicing Jan Prazak
2002-07-15 20:33         ` time-slicing Darren New
2002-07-16 16:30         ` time-slicing Pascal Obry
2002-07-16 23:05           ` time-slicing Jan Prazak
2002-07-16 21:33     ` time-slicing Robert Dewar
2002-07-15 21:03 ` gnat: time-slicing tmoran
2002-07-16 13:04   ` Jan Prazak
2002-07-16 21:29 ` Robert Dewar
2002-07-17 19:29   ` Jan Prazak
2002-07-17 16:44     ` Pascal Obry
2002-07-17 21:38       ` Jan Prazak
2002-07-17 19:21         ` Randy Brukardt
2002-07-17 22:44           ` Jan Prazak
2002-07-17 19:57             ` Marin David Condic
2002-07-18 18:38               ` Larry Kilgallen
2002-07-20 11:52                 ` Robert Dewar
2002-07-17 19:43         ` Pascal Obry
2002-07-18 18:55           ` Jan Prazak
2002-07-18 17:01             ` Pascal Obry
2002-07-18 17:03             ` Pascal Obry
2002-07-18 22:38         ` chris.danx
2002-07-18  2:50     ` R. Tim Coslet
2002-07-18 12:54       ` SteveD
2002-07-20 11:56       ` Robert Dewar
2002-07-18 12:02     ` Frank J. Lhota
2002-07-19  2:33 ` Robert A Duff
2002-07-19 13:32   ` Jan Prazak
2002-07-19 23:46   ` Keith Thompson
2002-07-20  0:36     ` Robert A Duff
2002-07-20  4:25       ` Darren New
2002-07-20 11:47     ` Robert Dewar
2002-07-21 10:58       ` Keith Thompson
2002-07-31 22:28       ` Robert A Duff
2002-08-01 19:28   ` Erroneous execution? (was Re: gnat: time-slicing) Ben Brosgol
2002-08-01 22:03     ` Robert A Duff
2002-08-02  3:59       ` Ben Brosgol
2002-08-13 22:30         ` Robert A Duff
2002-08-02  4:17       ` Robert Dewar
2002-07-19  3:17 ` time-slicing SteveD
2002-07-19 13:32   ` time-slicing Jan Prazak
2002-07-19 12:41     ` time-slicing SteveD
  -- strict thread matches above, loose matches on Subject: below --
2002-07-18  4:44 gnat: time-slicing Grein, Christoph
2002-07-18 18:55 ` Jan Prazak
2002-07-18 16:35   ` Sergey Koshcheyev
2002-07-19  1:37   ` Robert A Duff
replies disabled

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