Программа пробуждения F # - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть это требование: моя программа F # будет выполнять ежедневную работу в 11:00 утра; Я обычно включаю свой компьютер в 8:00 утра, так как я занят, поэтому я всегда забываю вовремя запускать свою программу F #. Итак, я хочу иметь функцию, которая может проверять, сколько секунд с настоящего момента до 11:00 утра, если есть 3 часа, тогда моя программа будет спать 10800 секунд, затем проснется и выполнит работу. Я знаю, что могу использовать планировщик задач Windows для такого рода работы, но таким образом я не увижу вывод из моей программы F #, поэтому я должен сделать это по-своему:

let wakeup() =
    let today = DateTime.Today.ToShortDateString()
    let beignTime = DateTime.Parse(today + " 11:00:00")
    // Don’t know what to do yet!

Для функции wakeup () я хочу вернуть int32 количество секунд, если текущее время предшествует beginTime, если текущее время позже, чем beginTime, просто верните 0.

let seconds2Go = wakeup()
if (seconds2Go > 0) then
   Thread.Sleep(seconds2Go * 1000)
else 
   printfn "Do daily job!"

Но я не знаю, как написать функцию wakeup (). Пожалуйста, предложите вашу помощь. Спасибо, John

Ответы [ 4 ]

2 голосов
/ 23 ноября 2011

Это делает трюк. Вам придется остановить его, нажав CTRL + C.

open System
open System.Threading

let (|TimeSpan|_|) value =
  match TimeSpan.TryParse(value) with
  | true, t -> Some t
  | _ -> None

let runDaily time f =
  let time = ref <| DateTime.Today.Add(time)
  let rec loop() =
    async {
      if DateTime.Now >= !time then
        time := (!time).AddDays(1.0)
        f()
      else do! Async.Sleep(1000)
      return! loop()
    }
  use cts = new CancellationTokenSource()
  Console.CancelKeyPress.Add(fun args -> cts.Cancel(); args.Cancel <- true)
  try Async.RunSynchronously(loop(), cancellationToken = cts.Token)
  with :? OperationCanceledException -> ()

[<EntryPoint>]
let main args = 
  match args with
  | [|TimeSpan time|] -> 
    runDaily time (fun () ->
      //TODO: program logic
    )
    0
  | _ -> eprintfn "Usage: program.exe time"; 1

Использование

program.exe 11:00 //run every day at 11AM
1 голос
/ 23 ноября 2011
 let wakeup () =
   let beginTime = DateTime.Today + TimeSpan(11,0,0)
   beginTime.Subtract(DateTime.Now).TotalSeconds |> int
1 голос
/ 23 ноября 2011
let wakeup () = 11.0*60.0*60.0 - (DateTime.Now - DateTime.Today).TotalSeconds |> int
1 голос
/ 23 ноября 2011

Почему бы вам не использовать Windows Scheuler для запуска программы в 11:00?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...