2

我只是在测试驱动我的程序,并正在查看它的进程的内存使用情况和其他。然后,我注意到我的 .NET 程序占用了大约 50% 的 CPU,几乎总是每隔一段时间就会跳到 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% 的风险。在这种情况下,我怀疑你有一台双核机器,这样一个核心就可以尽可能快地工作。这导致您的问题中有 50% 的数字。此外,我怀疑循环中的阻塞函数无法按预期工作,因此您的代码中没有任何内容可以让 cpu 中断。

您可以通过将 Thread.Sleep() 调用放入循环中来缓解此问题,但您可能知道,这可能会对您的套接字服务产生不良的副作用,以至于它实际上并没有一直在监听连接。

于 2013-01-31T04:46:12.987 回答
0

这不正常。注释掉循环,看看你是否有同样的问题。如果这样做,请尝试将 Thread.Sleep(milliseconds) 放入其中以暂停而不消耗 CPU 周期。如果这不是问题,请检查应用程序中的其他循环。

于 2013-01-31T04:43:41.430 回答