如何使程序不使用100%的cpu

本文关键字:100% cpu 何使 程序 | 更新日期: 2023-09-27 18:23:36

有5个线程在一个无限循环中运行。

其中2个将在队列不为空时发送消息。

其中4个会在5分钟内持续发送心跳。

其中之一是从另一个源请求数据。

当它使用100%的CPU时,我不能在窗口中使用任何其他应用程序。整个窗口变得非常慢。

编辑:WaitOne之后可以睡觉吗

if(autoEvent.WaitOne())
{
}
else
{
}
Thread.Sleep(100);

可以将睡眠放在订阅者之后。Recv()哪个是ZeroMQ

如果没有Recv(),所有线程都会休眠,但有一个线程我不敢在只有客户端的实时数据馈送线程中休眠。发送,只有一个线程会导致100%吗

如何使程序不使用100%的cpu

Q:如何使程序不使用100%CPU?

A: 不要创建繁忙循环!!!!

拦网很好。有很多方法可以实现"阻塞直到有事情可做"。包括使用报警信号或计时器(很差,但有一定的改进)、超时读取套接字(如果您碰巧收到网络套接字的通知)或使用超时的Windows事件对象。

如果其他操作都失败,您可以始终使用"Sleep()"。如果你能避免的话,我会劝阻你使用"睡眠"——几乎总是有更好的设计策略。但它将使您远离100%的CPU繁忙循环;)

====================================

附录:您发布了一些代码(谢谢!)

您正在使用xxx。WaitOne()。

只需使用WaitOne()(一个阻塞调用),并有一个超时。这是一个理想的解决方案:没有繁忙的循环,不需要"睡眠"!

http://msdn.microsoft.com/en-us/library/aa332441%28v=vs.71%29.aspx

将System.Threading.Sleep(100)(100毫秒睡眠=系统做其他事情的时间)放入无限循环中。

对于发送消息的线程,当队列为emtpy时,使用ResetEvent

DeliverMessageThread_DoWork
{
  while(true)
  {
    if(GetNextMessage() == null)
      MyAutoResetEvent.WaitOne(); // The thread will suspend here until the ARE is signalled
    else
    {
      DeliverMessage();
      Thread.Sleep(10); // Give something else a chance to do something
     }
  }
}
MessageGenerator_NewMessageArrived(object sender, EventArgs e)
{
   MyAutoResetEvent.Set(); // If the deliver message thread is suspended, it will carry on now until there are no more messages to send
}

这样,就不会有2个线程一直占用所有的CPU周期