2016-05-26 11 views
0

何かを印刷する散発的な作業があります。私は指定された時間すなわち4:40 PMにこのタスクを実行したいと思います。散発的なタスクは特定の時刻に実行されます

時間をチェックし、時間が指定された時間と等しいサイクリックタスクを作成するアイデアがあります。この周期的なタスクは、散発的なタスクの障壁を再表示します。しかし、私が指定した時刻(Unixのタイムスタンプや文字列で表される)が今の時刻と等しいかどうかをチェックする方法はありますか?私の指定した時刻をRavenscar ProfileにしたがってAda.Real_Time.Timeに変換する方法は?

どのように私はそれを達成できますか?ここで

は私のコードです:

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

に変換するDuration

  • 使用Ada.Real_Time.To_Time_Span。あなたの環境が市民時代と同期できない限り、将来的に適切なポイントまで「遅らせる」だけではないのはなぜですか? – trashgod

  • 答えて

    2

    GNATCOLL.RavenscarパッケージはRavenscarのプロファイルの制限に従いますが、それら無制限のprofを持つパーティションにコンパイルすることができますile。だから、あなたが唯一のRavenscarのをサポートするシステム用にコンパイルしている場合を除き、あなたは

    • を得ることがAda.Calendar.Time
    • 減算Ada.Calendar.Clockにあなたの16:40に変換(小さなエラーで呼び出しが有限の時間がかかるため)ことができますあなたが別の_epoch_を有していてもよく、単調 `Time`に民事時間を変換したいように見えますTime_Span
    関連する問題