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

私は今これを持っていますが、明らかにすべてを停止し、プロセスでCPUの50%を使用しています。このループをより適切に実行し、必要な方法で実行するために、何を代用または変更できるかを知りたいだけです。に。

4

4 に答える 4

1

システムクロックをチェックして、特定の時間に等しいかどうかを確認します。

これを行うには、2つの「正しい」方法があります。

  1. 何時かを気にしない通常のアプリを作成し、スケジュールタスクとしてWindowsで設定します。
  2. 時間を一度確認し、希望の時間までの時間を計算します。次に、その正確な期間を待機するタイマーを設定します。

いかなる状況でも、一度だけ実行されるこのようなものについてシステムクロックをポーリングし続けるべきではありません。

于 2009-11-03T00:35:24.857 に答える
1

あなたは付け加えられます

Threading.Thread.Sleep(0),

これにより、コンテキストスイッチが発生し、CPU使用率が大幅に削減されます

また、10または100ミリ秒ごとに呼び出されるタイマーオブジェクトを使用することを検討してください。これは、ループを使用するよりも使用法が優れています。

于 2009-11-03T00:19:54.217 に答える
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 に答える
0

Joelが指摘したように、代わりにタイマーを使用してみてください。アプリがフォームなのかコンソールなのかわからないので、一般的に使用してみます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 に答える