2010-12-10 22 views
1

J'ai une procédure avec des tâches. Je dois faire quelque chose après l'achèvement de toutes les tâches. Comment puis-je faire cela?Attente de tâches dans Ada

+1

La nature de cette question suggère que vous seriez mieux fournir plus d'informations sur quelle fonctionnalité vous essayez de mettre en œuvre, plutôt que de demander comment faire cette chose spécifique. La raison en est que ce que vous demandez n'est généralement pas quelque chose dont un programmeur Ada se trouverait confronté. –

Répondre

4

indiquer les tâches dans un bloc interne: le bloc ne quittera pas jusqu'à ce que toutes les tâches sont terminées, ARM7.6.1(4)

with Ada.Text_IO; use Ada.Text_IO; 
procedure After_Tasks is 
begin 
    Put_Line ("at the start"); 

    declare 
     task T1; 
     task T2; 
     task body T1 is 
     begin 
     delay 1.0; 
     Put_Line ("t1 done"); 
     end T1; 
     task body T2 is 
     begin 
     delay 2.0; 
     Put_Line ("t2 done"); 
     end T2; 
    begin 
     null; 
    end;  -- block here until T1 & T2 are completed 

    Put_Line ("at the end"); 
end After_Tasks; 
+0

Ce serait aussi ma suggestion. Cependant, je mettrais probablement le code "à la fin" dans le code appelant de la procédure juste après l'appel à la procédure. Déclarer des blocs a toujours l'air d'être un hack pour moi. –

4

Sans aucune connaissance de ce que vous êtes en train d'essayer d'accomplir, un couple poignarde à accomplir ce serait:

  • Monitor (sondage) attribut 'Terminated de chaque tâche en attente.
  • Implémentez une entrée "Shutdown" dans votre tâche (s) qui est la dernière chose que chaque tâche effectue. Avoir votre «contrôleur» rendez-vous avec l'entrée Shutdown de chaque tâche et une fois que toutes les tâches ont accepté et terminé le rendez-vous, à toutes fins utiles, vous pouvez conclure que les tâches ont toutes terminé. Pour les pédantistes parmi nous, nous pourrions exécuter un court délai (delay 0.0;) puis vérifier via l'attribut 'Terminé' que toutes les tâches sont terminées, ou au moins pragma Assert() donc.