Delphi   发布时间:2022-04-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何避免Delphi多线程中的100%CPU?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一种在多个服务器上发送和接收数据的机制.服务器在 Windows上运行,使用Delphi 7.

发送数据是在几个同时的线程中形成的,并且不可能首先知道哪个线程将形成数据.将数据添加到缓冲区的时刻由CriticalSection同步.发送线程不断检查是否有任何新数据要发送.通过这样做,每个线程吃掉1个CPU核心.这种方法非常快,但即使服务器没有发送数据,CPU也大约为100%.我需要多个线程,我需要避免这种高CPU使用率.

我尝试了两种选择:

>睡眠 – 如果缓冲区中没有数据,则运行睡眠(1). CPU内核未加载,但对新数据的响应速度大约低100倍.这不是解决方案.
>杀死和创建线程.如果缓冲区中没有数据,我会杀死该线程.添加数据的函数将创建一个新线程.新线程将发送数据,释放缓冲区并再次被杀死. CPU负载减少但创建和终止需要花费太多时间.结果,速度降低了100倍.

有没有替代睡眠(1)不消耗100%CPU并迅速做出反应?或者是否可以在某些事件发生之前暂停线程?

问题得到了回答.这适用于我https://stackoverflow.com/a/4401519/4052208.

解决方法

您可以让线程等待WaitFor *函数的数据.他们不会吃处理器资源.

我建议使用WaitForMultipLeojects,它有可能等待一些事件.例如,当数据在缓冲区中时,主事件(查找CreateEvent或Delphi包装类TEvent)应由数据生成器设置,而另一个事件用于线程终止:

//Execute body
repeat
  WaitRes := WaitForMultipLeobjects(2,@FEventHandles,false,CONST_TIMEOUT); // or INFINITE
  if WaitRes = WAIT_OBjeCT_0 + 1 then // event from data producer
    GetDataFromBuffer();

until WaitRes = WAIT_OBjeCT_0; // external event for thread stop

大佬总结

以上是大佬教程为你收集整理的如何避免Delphi多线程中的100%CPU?全部内容,希望文章能够帮你解决如何避免Delphi多线程中的100%CPU?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。