2009-11-03 2 views
0

Так что я немного новый для VB и просто играю с небольшим проектом, мне в настоящее время нужен цикл, который постоянно проверяет системные часы, чтобы убедиться, что он равен определенному время.Loop для проверки времени в VB.NET

While Not myTime.Hour = 24 

     If TimeOfDay = newTime Then 
      nfi.ShowBalloonTip(15) 
      intRandNumb = RandomNumber(1, 15) 
      dblAddMinutes = intTime + intRandNumb 
      newTime = TimeOfDay.AddMinutes(dblAddMinutes) 

     End If 
    End While 

У меня есть это прямо сейчас, но, очевидно, это шлифовальные все к остановке и с использованием 50% моего процессора в процессе, я просто хотел бы знать, что я могу заменить или изменить, чтобы сделать этот запуск цикла лучше и выполнять, как мне это нужно.

ответ

0

Как указал Джоэл, попробуйте использовать таймер вместо этого. Я не уверен, что ваше приложение является формой или консолью или другим, поэтому я постараюсь быть общим и использовать System.Timers.Timer.

код здесь (интервал установлен на 10мс, изменения в стоимости ваших потребностей):

Private timer1 As System.Timers.Timer  
Const interval As Integer = 10 


Sub initTimer() 
    timer1 = New System.Timers.Timer(10) 
    AddHandler timer1.Elapsed, AddressOf Me.timer_Elapsed 
    timer1.Start() 
End Sub 

Sub timer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) 
    'do your stuff here 
    'Console.WriteLine(e.SignalTime.ToString()) 
End Sub 
+0

OOps, я не понимал, что Гризли сделал образец. Шахта - это VB. Я C# -er, поэтому взял меня на некоторое время, чтобы получить коды. –

+0

Спасибо за ваше время, это действительно помогло, и теперь все работает гладко. – LeSabo

1

вы можете добавить

Threading.Thread.Sleep(0), 

это вызовет переключение контекста и значительно уменьшить загрузку процессора

Также рекомендуется использовать объект таймера вызывалась каждые 10 или 100 мс, это также будет лучше в использовании, то имея петлю

+0

Я никогда не использовал объект таймера до того, как будет идти об осуществлении один в этом случае? – LeSabo

+0

см. @ Grizzly о том, как реализовать решение таймера – Amirshk

1

Вы можете использовать

Threading.Thread.Sleep(0) 

Это приведет к тому, что рабочий поток даст оставшуюся часть текущего временного интервала, что немного снизит использование процессора. Однако вы должны рассмотреть, действительно ли вы СВАО заняты в ожидании того времени, или если вы могли бы уйти с установкой таймера отсчитывать разницу между текущим временем и ожидаемым временем, например:

  var t = new System.Timers.Timer((DateTime.Now - DateTime.Now).TotalMilliseconds); 
     t.Elapsed = DoSomething; 
     t.Start(); 
+0

, так что если я правильно его читаю, создавая таймер в миллисекундах разницы между двумя моментами и выполняющий что-то по истечении таймера? Прошу прощения, мне никогда не приходилось использовать таймер раньше. – LeSabo

+0

Да, это точно предполагаемое поведение (конечно, этот код - C#, поэтому при использовании его в vb.net есть небольшие синтаксические различия, но другие тогда ...) – Grizzly

+0

, конечно же, вау, большое спасибо за ваш Помогите. В течение короткого времени вы научили меня хорошему. – LeSabo

1

проверяя системных часов, чтобы убедиться, что он равен определенному времени.

Есть два «правильных» способов сделать это:

  1. Построить нормальное приложение, которое не заботится, сколько времени, и установить его в окнах, как задачи по расписанию.
  2. Проверить время после и рассчитать, сколько времени потребуется до желаемого времени. Затем настройте таймер, чтобы дождаться такой точной продолжительности.

Ни при каких обстоятельствах не следует проводить опрос системных часов на что-то подобное, которое будет запускаться только один раз.

+0

на основе образца кода в вопросе, я бы сказал, вариант 2 вернее!И я часто использовал этот метод сам. – ligos