【发布时间】:2014-04-11 23:15:48
【问题描述】:
假设我有 C++ 代码,例如
#include "myheaderfiles.h"
//..some stuff
//...some more stuff
int main()
{
double milliseconds;
int seconds;
int minutes;
int timelimit=2;
...
...
//...code here that increments
//.....milliseconds,seconds, and minutes
while(minutes <=timelimit)
{
//...do stuff
if(milliseconds>500)
{
//...do stuff
//...every half second
} //end if
} //end while
}//end main
该程序将运行良好并执行它应该执行的操作,但它会占用我 90% 以上的 cpu。
有人建议我在我的 while 循环中每 100 毫秒左右使用一次 usleep(),因为无论如何我真的只关心每 500 毫秒做一次事情。这样,它会在不需要时占用 CPU。
所以我像这样将它添加到我的 while 循环中
while(minutes <=timelimit)
{
//...do stuff
if(milliseconds>500)
{
//...do stuff
//...every half second
} //end if
usleep(100000);
} //end while
它编译得很好,但是当我运行它时,程序会在睡眠时挂起并且永远不会返回。我在某处读到,在调用 usleep 之前,需要刷新所有缓冲区,所以我刷新了所有文件流和 couts 等。仍然没有运气。
我已经搜索了 2 天的解决方案。我也使用过 sleep() ,但没有运气。
我找到了一些替代方案,但它们看起来很复杂,并且会在我的程序中添加很多我并不完全理解的代码,这会使它复杂化并使其变得混乱,而且它可能无法正常工作。
我之前从未真正在 while() 循环中考虑过太多,因为我编写的大多数程序都是针对微控制器或 FPGA 的,占用处理器是没有问题的。
如果有人可以提供帮助.... 任何资源、链接、书籍?谢谢。
【问题讨论】:
-
请告诉我您没有使用 CPU 时钟来测量时间...
-
你能展示你完整的 while() 循环吗?这可能有很多原因,这被称为忙循环问题。 usleep() 不会导致任何挂起。您的代码中还有其他问题。
-
我想知道——该程序有什么可做的,还是只是在某处闲逛?如果有事要做,更快地完成它不应该受到伤害(在 *nix 或 Windows 上,尽管可以调低 prio)。如果您正在投票,也许有一个事件驱动的解决方案?
-
如果你想要的话,为什么不注册让定时器唤醒并每隔半秒给你打电话呢?这似乎不是开始的正确解决方案。你确定它在睡觉时挂着吗?也许你没有正确增加“毫秒”。
-
你有没有在你的程序中使用信号?
标签: c++ while-loop cpu usleep