加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何避免Delphi多线程中的100%CPU?

发布时间:2020-12-15 04:31:37 所属栏目:大数据 来源:网络整理
导读:我正在创建一种在多个服务器上发送和接收数据的机制.服务器在 Windows上运行,使用Delphi 7. 发送数据是在几个同时的线程中形成的,并且不可能首先知道哪个线程将形成数据.将数据添加到缓冲区的时刻由CriticalSection同步.发送线程不断检查是否有任何新数据要
我正在创建一种在多个服务器上发送和接收数据的机制.服务器在 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读