2016-05-26 20 views
0

Ich habe eine sporadische Aufgabe, die etwas drucken. Ich möchte diese Aufgabe zu einem bestimmten Zeitpunkt, z. B. 16:40 Uhr, ausführen.Sporadic Task wird zu einer bestimmten Zeit ausgeführt

Ich habe eine Idee, zyklische Aufgabe zu erstellen, die Zeit überprüft und wenn die Zeit gleich meiner angegebenen Zeit ist, diese zyklische Aufgabe die Barriere der sporadischen Aufgabe erneut. Aber wie überprüfe ich, ob meine angegebene Zeit (dargestellt als Unix Timestamp oder String) gleich der Zeit ist? Wie konvertiert man meine angegebene Zeit in Ada.Real_Time.Time nach Ravenscar Profile?

Wie kann ich das in Ada erreichen?

Hier ist mein Code:

sprinkler.ads

pragma Profile(Ravenscar); 
with GNATCOLL.Ravenscar.Simple_Cyclic_Task; 
with GNATCOLL.Ravenscar.Simple_Sporadic_Task; 

package Sprinkler is 

    Counter : Integer := 0; 
    MyTime : String := "4:45"; 

    procedure My_Cyclic_Operation; 
    package My_Cyclic_Task is new GNATCOLL.Ravenscar.Simple_Cyclic_Task 
    (Task_Priority => 10, 
     Phase => 0, 
     Period => 1000, 
     Cyclic_Operation => My_Cyclic_Operation); 


    procedure My_Sporadic_Operation; 
    package My_Sporadic_Task is new GNATCOLL.Ravenscar.Simple_Sporadic_Task 
     (Task_Priority => 10, 
     Minimum_Interelease_Time => 1_000, 
     Protocol_Ceiling => 15, 
     Sporadic_Operation => My_Sporadic_Operation); 

end Sprinkler; 

sprinkler.adb

pragma Profile(Ravenscar); 
with Ada.Text_IO; use Ada.Text_IO; 
with Ada.Real_Time; use Ada.Real_Time; 

package body Sprinkler is 

    procedure My_Cyclic_Operation is 
    begin 
     -- Here I want to run My_Sporadic_Operation when time at now is equal to my specified time 
     null; 
    end My_Cyclic_Operation; 

    procedure My_Sporadic_Operation is 
    begin 
     Put_Line("Sporadic at specified time!"); 
    end; 

end Sprinkler; 
+3

Es sieht aus wie Sie eine bürgerliche Zeit zu einem monotonen 'Time' konvertieren mögen, die eine andere _epoch_ haben. Wenn sich Ihre Umgebung nicht mit der bürgerlichen Zeit synchronisieren kann, warum sollten Sie nicht einfach einen geeigneten Punkt in der Zukunft verschieben? – trashgod

Antwort

2

Die GNATCOLL.Ravenscar Pakete, die Beschränkungen des Ravenscar Profil gehorchen, aber sie kann in eine Partition kompiliert werden, die ein uneingeschränktes prof hat Ile. Also, wenn Sie für ein System sind kompilieren, die nur Ravenscar unterstützt, können Sie (mit einem kleinen Fehler, da die Anrufe nehmen endliche Zeit)

  • konvertieren Sie Ihre 04.40 bis Ada.Calendar.Time
  • subtrahieren Ada.Calendar.Clock zu erhalten eine Duration
  • Verwendung Ada.Real_Time.To_Time_Span zu konvertieren Time_Span