2

私は自分のプログラムをテストして、そのプロセスのメモリ使用量などを調べていました。その後、.NET プログラムの CPU 使用率が約 50% であり、ほぼ常に 98% の CPU にジャンプすることに気付きました。十分に長く実行すると、プログラムの不足により、より良い「クラップアウト」が発生します。

これは正常ですか?

アップデート:

method RemoteLink.ListenForClientConnections;
var theClient : HandleClient;
begin
    // Loop and wait for client connection.
    while true do
    begin   
        //blocks until a client has connected to the server  
        ServerClientSock := ServerSock.AcceptTcpClient; <<== Blocking 
        theClient := new HandleClient;
        theClient.startClient(ServerClientsock);

        Invoke(new UpdateClients(UpdateTheList),theClient);
    end;
end;

実際、問題の while ループ スレッドは上のスレッドではなく、下のスレッドです。

アップデート:

method TSerialIndicator.BigLoop;
begin
  while true do
  begin
    if TurnOnTx then
    begin
        Thread.Sleep(50);
        TxLight.BackColor := Color.Black; 
        TurnOnTx:=false;
    end;

    if TurnOnRx then
    begin
        Thread.Sleep(50);
        RxLight.BackColor := Color.Black;
        TurnOnRx:=false;
    end;
  end;
end;

このスレッドは、プログラムがロードされて実行されるとすぐに開始されます。ご覧のとおり、プログラムが winform のインジケーターと通信していない場合、更新されないため、このループは遅延なくループします。

4

2 に答える 2

4

言語やプラットフォームに関係なく、スタイル ループがあるときはいつでもwhile(true)、ループ コンテンツを正しくビルドしないと、単一のコアが 100% または 100% 近くに固定されるリスクがあります。この場合、1 つのコアが可能な限り高速に動作するように、デュアル コア マシンを使用していると思われます。これにより、質問から 50% の数値が得られます。さらに、ループ内のブロッキング関数が期待どおりに機能しないのではないかと思われるため、コードには CPU に休憩を与えるものは何もありません。

Thread.Sleep() 呼び出しをループに配置することで問題を軽減できますが、ご存知のように、これによりソケット サービスに望ましくない副作用が生じ、実際には常に接続をリッスンしなくなる可能性があります。

于 2013-01-31T04:46:12.987 に答える
0

これは正常ではありません。ループをコメントアウトして、同じ問題があるかどうかを確認してください。その場合は、Thread.Sleep(milliseconds) を入れて、CPU サイクルを消費せずに一時停止してみてください。これが問題でない場合は、アプリケーションの他のループを確認してください。

于 2013-01-31T04:43:41.430 に答える