有5个线程在无限循环中运行。
当队列不为空时,其中2个将发送消息。
其中4人将在5分钟内继续发送心跳。
其中一个是从另一个来源请求数据。
当它使用100%的CPU时,我无法在窗口中使用任何其他应用程序。整个窗口变得很慢。
编辑:可以在WaitOne之后睡觉吗?
if(autoEvent.WaitOne())
{
}
else
{
}
Thread.Sleep(100);
可以在subscriber.Recv()之后放入ZeroMQ吗?
所有线程如果没有Recv()我就睡了,但是有一个线程我不敢在只有client.Send的实时datafeed线程中放一个睡眠,只有一个线程会导致100%?
答案 0 :(得分:4)
问:如何使程序不使用100%CPU?
答:不要创建一个繁忙的循环!!!!
阻止是好的。有很多方法可以实现“阻止直到有事可做”。包括使用报警信号或定时器(差,但有一定的改进),使用超时(如果您恰好通过网络套接字通知)执行套接字读取或使用超时的Windows事件对象。
失败一切,你总是可以使用“睡眠()”。如果你能避免使用“睡眠”,我会劝阻它 - 几乎总有更好的设计策略。但它将让你远离100%CPU繁忙的循环;)
=======================================
附录:你发布了一些代码(谢谢!)
你正在使用xxx.WaitOne()。
只需使用WaitOne()(阻塞调用),超时。这是一个理想的解决方案:没有繁忙的循环,不需要“睡眠”!
http://msdn.microsoft.com/en-us/library/aa332441%28v=vs.71%29.aspx
答案 1 :(得分:1)
在无限循环中放置System.Threading.Thread.Sleep(100)(100毫秒睡眠=系统执行其他操作的时间)。
答案 2 :(得分: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周期