comp.lang.ada
 help / color / mirror / Atom feed
* Q: Stopping a task running a long simulation
@ 2010-03-11 13:08 Gautier write-only
  2010-03-11 18:11 ` Anh Vo
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Gautier write-only @ 2010-03-11 13:08 UTC (permalink / raw)


Hello,
Being still a bit new to tasking, I have a question of how to
terminate correctly a certain kind of task.
I have a task type which is waiting for running a potentially long
simulation; it is kind of a "daemon".
(the rationale of using a task type is that I have several simulations
that can be run in parallel, hence an array of these tasks).
Now this simulation occurs within a GUI, where the user might want to
stop it.
Here is the task type I've defined:

  task type Simulation_type is
    entry Start;
    entry Run( [some parameters] );
    entry Stop;
  end;

  Simulation: array(PF_version) of Simulation_type;

  task body Simulation_type is
  begin
    accept Start;
    loop
      select
        accept Stop;
        exit;
      or
        accept Run( [some parameters] ) do
          -- some quick parameter passing
        end Run;
        Compute( [some parameters] );
      or
        delay 0.2; -- relax
      end select;
    end loop;
  end Simulation_type;

For aborting the simulation, I have tried this (happens when the main
GUI window is destroyed):
    for v in PF_version loop
      abort Daemons.Simulation(v);
    end loop;
but (as expected if I've understood Barnes' chapter correctly), the
task waits for 'Compute' to complete.
At least, it is what happens with GNAT under Windows: despite the
above, the GUI closes but the program somehow is still alive and CPU-
busy.

I have an alternative to that.
'Compute' has a generic 'Feedback' procedure for showing progress.
I could with that way give a Boolean, user_abort, to 'Feedback', and
'Compute' would stop when an ad-hoc exception is raised, and return
normally on its own.
Meanwhile, I could call the 'Stop' entry which could be soon be
activated, since Compute would stop quickly, and the daemon task would
be terminated, and I could close the shop properly.

Now my question: is it the right way of doing it (I'm sure it will
work), or is there something more straightforward ?

TIA

Gautier



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2010-03-12  2:03 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-03-11 13:08 Q: Stopping a task running a long simulation Gautier write-only
2010-03-11 18:11 ` Anh Vo
2010-03-12  0:24 ` tmoran
2010-03-12  1:15   ` Gautier write-only
2010-03-12  1:27 ` Adam Beneschan
2010-03-12  1:50   ` Gautier write-only
2010-03-12  2:03   ` Gautier write-only

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