gpt4 book ai didi

c++ - 在不消耗太多 CPU 周期且没有 sleep ()的情况下循环?

转载 作者:可可西里 更新时间:2023-11-01 18:34:58 24 4
gpt4 key购买 nike

我正在做一个 VoIP 程序,它不断检查录音缓冲区中是否有任何内容(FMOD 库,只要函数 getRecordPosition > 0,缓冲区中就有数据)。

所以它会是这样的:

while (true) {
if(getRecordPosition>0) {
process data....
}
}

然而,这会导致非常高的 CPU 使用率。一个版本是使用 sleep() 但如果可能我宁愿不使用它。例如,带有事件驱动循环的 win32 消息处理不会消耗很多 cpu 周期,这是我试图模仿的东西。同时我明白必须经常调用函数 getRecordPosition() 以查看返回值是否大于 0。

我是否坚持执行 while(true) 循环和 sleep() 一小段时间以保持低 CPU 使用率?

我用谷歌搜索并做了一些查找,但大多数返回使用 sleep() 或一些 POSIX 与互斥同步。 (我正在做一个 c++ win32 应用程序)

干杯

---编辑:忘了说我没有访问 fmod source corde 的权限:/---

最佳答案

如果可以的话,最好的做法是不要像您所说的那样模仿事件驱动的架构,而是实际使用事件驱动的架构。我对您的代码一无所知,尤其是您是否控制了录音缓冲区的代码。但是如果你确实控制了写入缓冲区的代码,那么你可以在写入缓冲区时触发一个事件:

(伪文档如下)

主线程:

HANDLE buf_event = CreateEvent(...);
// ...
CreateThread(BufferControl, ...);

缓冲区写入线程:

OnWriteToBuffer()
{
buffer.Write(...);
SetEvent(buf_event);
}

然后当缓冲区中有数据等待时,在您想做某事的线程中,等待事件发出信号:

缓冲区读取线程

rc = WaitForSingleObject(buf_event, INFINITE);
if( rc == WAIT_OBJECT_0 )
{
// there's somethign in the buffer
}

关于c++ - 在不消耗太多 CPU 周期且没有 sleep ()的情况下循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4648821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com