2

while ループの CPU をどのように制限しますか?

この場合、while ループ内のコードは次のとおりです。

Private Sub wait(ByVal time)
        Dim sw As New Stopwatch
        sw.Start()
        Do While sw.ElapsedMilliseconds < time And StillOpen = True
            Application.DoEvents()
        Loop
        sw.Stop()
    End Sub

しかし、今、ここで問題があります。このループにより、毎秒、1 秒に 1 回、while ループが実行され、waitサブルーチンがこの遅延を引き起こしています。

これが占有しているCPUを制限するにはどうすればよいですか? 何らかの理由で、私のタスク マネージャーは、この単純なタスクを実行するのに 50 個の CPU を使用していると言っていますが、おそらく 1 つか 2 つしか必要としないはずです。 2 年前のラップトップであることを考えると、これは奇妙です。

どのユーザーもびっくりさせたくないのですが、最近の人々の様子を知っていると....

とにかく、言語は vb.net です。誰か助けてくれませんか?

ありがとう!

EDIT:明確にするために、そのコードはwhileループ自体の中にありませんが、サブルーチンの呼び出しは、つまりwait(1000)

4

7 に答える 7

7

タイマーイベントを使用してください!!! CPUの努力はほとんどありません。

于 2009-09-02T20:14:35.213 に答える
6

ループの反復の間に、いつでもある種のスリープを実行できます...

私はVB.NETに精通していませんが、100〜200ミリ秒の期間は、CPU使用率を下げるのにおそらく十分すぎるでしょう。

例えば:

Do while (...)
    Application.blah();
    System.Threading.Thread.Sleep(150);
End

編集いくつかの調査の後、私はあなたが望む関数は次のとおりだと思います:System.Threading.Thread.Sleep()

于 2009-09-02T20:12:19.040 に答える
4

コードは、パラメーターで指定された期間、whileループでApplication.DoEvents()を常に実行していtimeます。これにより、CPUのコアが1つ消費されるため、プロセッサの使用率が50%になります(デュアルコアプロセッサを使用していますよね?)。これは醜い待つ方法です。代わりに、Thread.Sleep()を呼び出して、スレッドが待機するミリ秒数を渡すことができます。

アプリケーションの応答性を維持したい場合は、タイマーをスピンオフし、タイマーがトリガーされるまでUIをアクションからブロックすることもできます。(軽くテストされた)のようなもの:

// constructor or designer code
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Tick += new EventHandler(timer_Tick);

void Wait(int interval)
{
    timer.Interval = interval;
    timer.Start();
    BlockUIOperations(); // implement yourself
}

void timer_Tick(object sender, EventArgs e)
{
    timer.Stop();   
    EnableUIOperations(); // implement yourself
}

これがVBへの翻訳の私の試みです:

'' Add a Timer object to the form named "Timer".
'' Hook its Tick event to Timer_Tick

Private Sub Wait(ByVal interval As Integer)
    Timer.Interval = interval
    Timer.Start()
    BlockUIOperations() '' implement yourself
End Sub

Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer.Tick
    Timer.Stop()
    EnableUIOperations() '' implement yourself
End Sub
于 2009-09-02T20:17:19.310 に答える
0

ええと、CPUは実行中は常に100%で実行されているので、CPU使用率を制限する唯一の実用的な方法は、バーストまたはループを実行し、その間にスリープすることです。

ラップトップCPUには通常、CPUが正常に動作していないときにCPUの速度を低下させる、SpeedStepテクノロジまたは同等のテクノロジが搭載されていますが、アプリケーションが少なくとも直接ではなく、CPUを制御できると想定するのは合理的ではありません。CPU使用率を測定し、作業サイクルとスリープサイクルの長さを調整して目的の結果を得ると、間接的に影響を与えることができる場合があります。

于 2009-09-02T20:17:11.340 に答える
0

これは、VB.net スリープの代替として最適です。スリープ コマンドがないため、コンソール アプリが応答しないと報告されなくなりました。

モジュールの上に Imports System.Threading を追加し、これをサブメインのすぐ上に配置するだけです

Public Sub Wait(ByVal ms As Integer)

   Using wh As New ManualResetEvent(False)
        wh.WaitOne(ms)

    End Using
End Sub

次に、サブメインで使用します

wait(100) 

アプリを 100 ミリ秒一時停止します。

楽しむ

于 2013-04-14T15:59:05.313 に答える
0

現在のスレッドをブロックしてもかまわない場合は、WaitHandle を使用できます。


    Public Sub Wait(ByVal ms As Integer)

        Using wh As New ManualResetEvent(False)
            wh.WaitOne(ms)
        End Using

    End Sub

    Sub Main()

        Console.WriteLine("Hello World!")
        Wait(5000)
        Console.WriteLine("Good-Bye!")

    End Sub

もちろん、達成しようとしていることに応じて、より複雑なものを構築することもできます。

于 2009-09-02T21:04:05.503 に答える