我目前有这段代码
#include <iostream>
#include <curl.h>
#include <windows.h>
#include "boost\timer.hpp"
int main(void)
{
CURL *curl;
CURLcode res;
boost::timer t;
int number = 1;
while (number == 1)
{
if(t.elapsed() > 10)
{
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "http://google.com");
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
}
t.restart();
}
}
}
我想要它做的是继续执行这个程序,永远不会结束,直到有人关闭窗口。 我尝试了上述代码,但是在我的四核CPU上CPU使用率飙升至25%。
那么如何继续执行程序并在不使用太多CPU的情况下循环代码呢?
P.S 四核上25%表示单核CPU上100%的CPU使用率。
答案 0 :(得分:3)
您可以使用Sleep(10000)
暂停程序执行约。 10秒您可以删除boost::timer
- 在每次循环迭代中只睡10秒(睡眠不准确,但10秒钟的误差应该可以忽略不计)。
你的代码就是所谓的“繁忙循环” - 对于CPU而言,无论是在没有太多工作的情况下在紧密循环中闲逛还是进行大量计算,都没有区别。两者都将使用100%的CPU核心,因为有一个无休止的指令流进来。要少用,你需要放弃执行一段时间让操作系统执行其他进程。
答案 1 :(得分:2)
您目前正在做的是忙着等待。也就是说,即使你的程序不需要做任何事情,它仍然保持循环旋转,等待计时器。您需要做的是执行一个真正的睡眠,它告诉您的操作系统该过程在接下来的10秒内不需要做任何事情。
在增强中进行真正睡眠的一种方法是boost::this_thread::sleep功能。
答案 2 :(得分:1)
如果需要使用sleep()
减慢速度。基本上你需要让你的线程进入休眠状态以允许其他进程执行。
答案 3 :(得分:1)
您实施的内容称为忙碌等待,被认为是非常糟糕的风格。使用sleep
暂停程序执行一小段时间,并将永久循环写为:
for (;;)
或
while (true)
答案 4 :(得分:0)
看起来你想在每次操作后都睡一觉。
答案 5 :(得分:0)
你可以boost::threads
在它自己的线程中运行它,然后在主线程中执行thread.join等待它。如果另一个线程永远不会结束,因为while(true)
,那么你的程序将一直运行,直到你关闭窗口。
答案 6 :(得分:0)
在while
循环内调用SwitchToThread()
。 (Sleep
不太理想,因为即使没有其他线程需要,也会失去当前时间片。)
答案 7 :(得分:0)
考虑使用计时器而不是做这么紧的循环。 或者,您可以在其间放置System.Threading.Thread.Sleep(300)。
有人必须杀死你关闭它的进程,我无法识别代码中的任何窗口。
如果您正在浏览一个网站(看起来您正在与Google做某事)那么我会建议您进行更大的间隔!没有多少网站管理员会很高兴看到这样的活动。它更可能被视为DOS攻击!
任何方式,如果有一个窗口,而是将此代码放在计时器委托中,否则启动计时器并允许用户以某种方式退出程序(可能使用Console.ReadKey()左右)。