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.9 required=5.0 tests=BAYES_00,FORGED_GMAIL_RCVD, FREEMAIL_FROM autolearn=no autolearn_force=no version=3.4.4 X-Google-Thread: 103376,6516065ab7b5a533 X-Google-NewGroupId: yes X-Google-Attributes: gida07f3367d7,domainid0,public,usenet X-Google-Language: ENGLISH,ASCII Path: g2news1.google.com!postnews.google.com!s36g2000prf.googlegroups.com!not-for-mail From: Anh Vo Newsgroups: comp.lang.ada Subject: Re: Q: Stopping a task running a long simulation Date: Thu, 11 Mar 2010 10:11:06 -0800 (PST) Organization: http://groups.google.com Message-ID: <9afd22da-66a9-4798-b2d1-c71269d35471@s36g2000prf.googlegroups.com> References: NNTP-Posting-Host: 149.32.224.33 Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Trace: posting.google.com 1268331066 13155 127.0.0.1 (11 Mar 2010 18:11:06 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Thu, 11 Mar 2010 18:11:06 +0000 (UTC) Complaints-To: groups-abuse@google.com Injection-Info: s36g2000prf.googlegroups.com; posting-host=149.32.224.33; posting-account=Qh2kiQoAAADpCLlhT_KTYoGO8dU3n4I6 User-Agent: G2/1.0 X-HTTP-UserAgent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; InfoPath.2),gzip(gfe),gzip(gfe) Xref: g2news1.google.com comp.lang.ada:9519 Date: 2010-03-11T10:11:06-08:00 List-Id: On Mar 11, 5:08=A0am, Gautier write-only wrote: > 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: > > =A0 task type Simulation_type is > =A0 =A0 entry Start; > =A0 =A0 entry Run( [some parameters] ); > =A0 =A0 entry Stop; > =A0 end; > > =A0 Simulation: array(PF_version) of Simulation_type; > > =A0 task body Simulation_type is > =A0 begin > =A0 =A0 accept Start; > =A0 =A0 loop > =A0 =A0 =A0 select > =A0 =A0 =A0 =A0 accept Stop; > =A0 =A0 =A0 =A0 exit; > =A0 =A0 =A0 or > =A0 =A0 =A0 =A0 accept Run( [some parameters] ) do > =A0 =A0 =A0 =A0 =A0 -- some quick parameter passing > =A0 =A0 =A0 =A0 end Run; > =A0 =A0 =A0 =A0 Compute( [some parameters] ); > =A0 =A0 =A0 or > =A0 =A0 =A0 =A0 delay 0.2; -- relax > =A0 =A0 =A0 end select; > =A0 =A0 end loop; > =A0 end Simulation_type; > > For aborting the simulation, I have tried this (happens when the main > GUI window is destroyed): > =A0 =A0 for v in PF_version loop > =A0 =A0 =A0 abort Daemons.Simulation(v); > =A0 =A0 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 ? > There is another alternative to shut them down. That is to replace delay 0.2 statement by terminate alternative. Calling Stop entry to shutdown the task is the gentle way to terminate a task. How about to generate a signal to call Stop entry when the GUI is closed. Anh Vo