2013-05-14 2 views
0

Мне нужно выполнить командную строку в час и половину часа. Есть ли лучшие способы сделать это, как это? Возможно, те, которые не включают проверку часа каждую секунду.Лучший способ запланировать задачи в vb.net

Таймер с 1 второго интервала:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 

     For i As Integer = 0 To 24 
      If TimeString = i & ":00:00" & i Then or TimeString = "0" & i & ":00:00 or If TimeString = i & "30:00:" & i Then or TimeString = "0" & i & ":30:00 

      End If 
     Next 
End Sub 
+1

Вам нужно создать приложение для этого? Вы можете использовать Task Scheduler (панель управления) в Windows. – ZippyV

+0

Я хотел бы объединить все в одну программу, чтобы не было других потребностей «установки». Я предполагаю, что время проверки раз в секунду на самом деле не очень тяжелое, но мне просто интересно, есть ли альтернатива, потому что я чувствую, что это довольно глупо. – user2376356

+0

Почему вы не устанавливаете интервал таймера на полчаса? – Novemberland

ответ

1

Шаг 1 - вычислить время от теперь до следующего часа или полчаса знака;

Шаг 2 - установите период прошедшего времени вашего таймера равным времени, вычисленному на этапе 1;

Шаг 3 - когда таймер гаснет, сбросьте прошедшее время на 30 минут, а затем выполните работу, которую вам нужно выполнить.

Если процесс должен выполняться точно в час/полчаса, пересчитайте время, необходимое на этапе 3, а затем просто установите его на 30 минут (это компенсирует дрейф).

Вот несколько кодов для расчета миллисекунд до полуночи; вы должны уметь работать оттуда

Private Function MillisecondsToMidnight() As Integer 

    Dim ReturnValue As Integer 
    Dim ts As TimeSpan 

    Dim Tomorrow As DateTime = Today.AddDays(1) 
    ts = Tomorrow.Subtract(Now) 

    ReturnValue = ts.TotalMilliseconds() 

    ts = Nothing 
    Return ReturnValue 

End Function 
+0

Я так и не подумал об этом, спасибо. – user2376356

0

Ваш вопрос действительно интересный. Я думаю, что теперь желаемая функциональность полностью реализована ниже. Я тестировал его, и я считаю, что он работает.

Предположив вы вызываете всю функциональность с помощью Button1 и вы хотите использовать компонент Timer мы имеем:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    Dim seconds As New Integer() 
    Dim minutes As New Integer() 
    seconds = System.DateTime.Now.TimeOfDay.Seconds 
    minutes = System.DateTime.Now.TimeOfDay.Minutes 
    Dim firstOccurrence As TimeSpan = TimeSpan.Zero 
    Do 
     If seconds.Equals(60) Then 
      Exit Do 
     Else 
      seconds = seconds + 1 
      firstOccurrence = firstOccurrence + TimeSpan.FromSeconds(1) 
     End If 
    Loop 

    Do 
     If minutes.Equals(59) Or minutes.Equals(29) Then 
      Exit Do 
     Else 
      minutes = minutes + 1 
      firstOccurrence = firstOccurrence + TimeSpan.FromMinutes(1) 
     End If 
    Loop 

    Timer1.Interval = (((firstOccurrence.Minutes) * 60) + ((firstOccurrence.Seconds))) * 1000 
    Timer1.Enabled = True 


End Sub 

Private Sub Timer1_Tick (отправитель As Object, е Как EventArgs) Ручки Timer1.Tick

'execute your code here 
    Timer1.Interval = 30 * 60 * 1000 

End Sub 
+0

Я сделал нечто подобное. http://pastebin.com/1JdSBR4E timer1 находится на 30-минутном интервале. EDIT: только что заметил, что> должен быть> = – user2376356

+0

Вы пытались увидеть, работает ли мой код или у него возникли проблемы? – Novemberland

+0

Не могу сказать, что у меня есть, но я не думаю, что это сработает, так как ваш цикл будет только считаться до 60, но быстро ваш компьютер сможет его запустить. Я также думаю, что ваш тайный таймер1_tick должен быть timer2_tick. Но я не эксперт, поэтому не верю всему, что говорю. – user2376356