2016-04-24 12 views
0

Ich habe folgende AufgabeAda - Task-Abschlussfehler - "Statement erwartet"

task body auto is 
    begin 
     Put_Line(licencepalte.all & " set off."); 
     delay traveltime.all; 
     Put_Line(licencepalte.all & " arrived."); 
     loop 
     select 
      indicator.passthrough; 
      terminate; -- error for this line: 'statement expected' 
     or 
      delay 0.2; 
      Put_Line(licencepalte.all & " is waiting."); 
     end select; 
     end loop; 
    end auto; 

wo wir eine Kontrollleuchte und einige Autos (Auto ~ Automobile) mit Aufgaben und protecteds darstellen. Mein Hauptproblem ist, dass ich nicht weiß, wie man kündigt, wenn der Indikator den Eintrag des Autos akzeptiert. Sie können sehen, was ich gerade versuche, und es erscheint ein Fehler (siehe inline). Wie kann ich die Aufgabe stoppen, wenn der Eintrag akzeptiert wird? Warum funktioniert das terminate nicht? Vielen Dank!

Antwort

2

Wenn ich Ihre Frage richtig verstehe, würde eine statt terminate schön tun.

+0

Sie haben Recht. Weißt du wann und wie man kündigen? Und welche Art von Aussage will es in diesem Fall? –

+0

Die Syntax bei [ARM 9.7.1] (http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-9-7-1.html) besagt, dass Sie keine Anweisung (' indicator.passthrough; ') zwischen' or' und 'terminate'. Es kann nur 'oder enden;'. –

4

terminate ist keine "Aktion", die Sie ausführen. Das heißt, Sie können keine terminate-Anweisung an einer beliebigen Stelle im Aufgabenhauptteil verwenden, um die Aufgabe zu beenden. Das Beenden einer Aufgabe besteht darin, dass die Ausführung die end erreicht, die den Körper beendet; in Ihrem Fall funktioniert 10 zum Verlassen der Schleife, wie in Jacobs Antwort.

Der Zweck von or terminate ist das Programm zu sagen, dass eine Aufgabe für die Kündigung geeignet ist (ich weiß nicht, ob es einen besseren technischen Begriff dafür gibt). Angenommen, Ihre Aufgabe wie folgt aussieht:

task body Task_Type_1 is 
begin 
    loop 
     select 
      accept Entry_1(...parameters...) do 
       -- something 
      end Entry_1; 
     or 
      accept Entry_2(...parameters...) do 
       -- something 
      end Entry_2; 
     end select; 
    end loop; 
end Task_Type_1; 

Wenn der „etwas“ Code der accept Aussagen nie die Schleife beendet, wird die Aufgabe nicht beenden. Dies bedeutet, dass andere Konstrukte, die die Aufgabe einschließen, niemals beendet werden können. Zum Beispiel:

procedure Proc is 
    T1 : Task_Type_1; 
begin 
    -- do some stuff 
    -- now we're at the end, and we have to wait for T1 to complete 
end Proc; 

Die Prozedur erstellt eine Aufgabe des Typs Task_Type_1 und gestartet. Dann wird der Körper der Prozedur ausgeführt. Wenn end Proc; erreicht ist, wird die Prozedur nicht sofort beendet, weil sie warten muss, bis die Aufgabe ihren Auftrag beendet. Aber so wie die Aufgabe geschrieben wird, wird die Aufgabe niemals abgeschlossen. Daher wird Proc nie zurückkehren, und das Programm wird wahrscheinlich Deadlock.

or terminate ist, wie zu sagen, dass die Aufgabe beenden kann:

task body Task_Type_1 is 
begin 
    loop 
     select 
      accept Entry_1(...parameters...) do 
       -- something 
      end Entry_1; 
     or 
      accept Entry_2(...parameters...) do 
       -- something 
      end Entry_2; 
     or 
      terminate; 
     end select; 
    end loop; 
end Task_Type_1; 

In diesem kleinen Beispiel, wo wir ein Verfahren haben, dass dies eine Aufgabe schafft nur, or terminate bedeutet: wenn diese Aufgabe einen Punkt erreicht, wo es in der select gesperrt ist, da es keine eingehenden Anrufe gibt, und, wenn Proc das Ende seines Codes erreicht hat, dann wir die Aufgabe beenden. Der Task-Body wird beendet, und die abschließende Fertigstellung ist abgeschlossen. Anschließend kann Proc abgeschlossen werden.

or terminate kann nur in einer "selektiven Annahme" verwendet werden. Wenn Sie select Some_Other_Task.Entry_2(...); sagen, so dass es blockiert, bis der Eintrag der anderen Aufgabe verfügbar ist, können Sie or terminate in dieser Art von select nicht verwenden.

In einem komplexeren Fall könnte eine Prozedur zwei oder mehr Aufgaben erstellen. Wenn dieses Verfahren seine end-Anweisung erreicht, wird es erst zurückgegeben, wenn (grob gesagt) alle von ihm erstellten Aufgaben abgeschlossen sind. oder Alle Aufgaben, die nicht abgeschlossen wurden, werden für select-Anweisungen mit or terminate-Klauseln blockiert.Wenn Letzteres eintritt, werden alle diese Aufgaben abgeschlossen, und dann kann die Prozedur zurückkehren.

Die Regel über "Alternativen beenden" lautet in RM 9.3(6). Es spricht in Abhängigkeit von einem Meister; In dem oben gezeigten Beispiel ist Proc der Master.