0

所以我对VB有点陌生,只是在玩一个小项目,我目前需要一个循环来不断检查系统时钟,看看它是否等于某个时间。

   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% 的 cpu,我只想知道我可以替换或更改什么以使这个循环运行得更好并执行我需要的方式至。

4

4 回答 4

1

您可以使用

Threading.Thread.Sleep(0)

这将导致工作线程产生剩余的当前时间片,这将大大减少 CPU 使用率。但是,您应该考虑您是否真的很忙等待时间,或者您是否可以通过设置计时器来倒计时当前时间和预期时间之间的差异,例如:

            var t = new System.Timers.Timer((DateTime.Now - DateTime.Now).TotalMilliseconds);
        t.Elapsed = DoSomething;
        t.Start();
于 2009-11-03T00:29:43.900 回答
1

检查系统时钟以查看它是否等于某个时间。

有两种“正确”的方法可以做到这一点:

  1. 构建一个不关心现在几点的普通应用程序,并在 Windows 中将其设置为计划任务。
  2. 检查一次时间计算距离所需时间的时间。然后设置一个计时器来等待确切的持续时间。

在任何情况下,您都不应继续轮询系统时钟以获取仅运行一次的类似内容。

于 2009-11-03T00:35:24.857 回答
1

你可以加

Threading.Thread.Sleep(0),

这将导致上下文切换并大大降低 CPU 使用率

还可以考虑使用每 10 或 100 毫秒调用一次的计时器对象,这在使用上也会比使用循环更好

于 2009-11-03T00:19:54.217 回答
0

正如乔尔指出的那样,您应该尝试使用计时器。我不确定您的应用程序是表单还是控制台或其他,所以我会尝试通用并使用System.Timers.Timer.

这里的代码(间隔设置为10ms,更改为您需要的值):

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
于 2009-11-03T00:56:17.467 回答