2

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

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

其中4个将在5分钟内继续发送心跳。

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

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

编辑:可以在 WaitOne 之后放置睡眠吗?

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

可以在作为 ZeroMQ 的subscriber.Recv() 之后放置睡眠吗?

如果没有 Recv(),所有线程我都会休眠,但是有一个线程我不敢在只有 client.Send 的实时数据馈送线程中休眠,只有一个线程会导致 100% 吗?

4

3 回答 3

4

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

A:不要创建一个繁忙的循环!!!!

阻塞是好的。有很多方法可以完成“阻塞直到有事可做”。包括使用警报信号或计时器(很差,但有一定的改进),使用超时执行套接字读取(如果您碰巧通过网络套接字通知您)或使用具有超时的 Windows 事件对象。

失败了,你总是可以使用“Sleep()”。如果可以避免,我会不鼓励使用“睡眠”——几乎总是有更好的设计策略。但它会让你远离 100% CPU 繁忙的循环;)

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

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

您正在使用 xxx.WaitOne()。

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

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

于 2013-07-17T08:55:44.043 回答
1

将 System.Threading.Thread.Sleep(100) (100 毫秒睡眠 = 系统执行其他操作的时间)放入无限循环中。

于 2013-07-17T08:54:13.523 回答
0

对于发送消息的线程,当队列为空时,使用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 周期

于 2013-07-17T09:03:41.543 回答