3

最近我一直在用 C++ 编写一个程序,它 ping 三个不同的网站,然后根据通过或失败,它会等待 5 分钟或 30 秒,然后再试一次。

目前我一直在使用 ctime 库和以下函数来处理我的等待。但是,根据我的 CPU 计,这是一个不可接受的解决方案。

void wait (int seconds)
{
   clock_t endwait;
   endwait = clock () + seconds * CLOCKS_PER_SEC;
   while (clock () < endwait) {}
}

这个解决方案不可接受的原因是,根据我的 CPU 计,程序在等待时以我的 CPU 的 48% 到 50% 运行。我有一个 Athlon 64 x2 1.2 GHz 处理器。我的 130 行程序也不可能接近 50%。

我怎样才能更好地编写我的等待函数,以便它只使用最少的资源?

4

5 回答 5

12

为了保持便携性,您可以使用Boost::Thread进行睡眠:

#include <boost/thread/thread.hpp>

int main()
{
    //waits 2 seconds
    boost::this_thread::sleep( boost::posix_time::seconds(1) );
    boost::this_thread::sleep( boost::posix_time::milliseconds(1000) );

    return 0;
}
于 2010-11-05T05:47:15.580 回答
6

对于 C++11 标准,可以使用以下方法:

std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::this_thread::sleep_for(std::chrono::seconds(100));

或者sleep_until可以使用。

于 2012-03-15T11:16:06.797 回答
3

使用sleep而不是空的 while 循环。

于 2010-11-05T05:07:19.173 回答
3

只是为了解释发生了什么:当您调用clock()时,您的程序再次检索时间:您要求它尽可能快地执行此操作,直到它到达结束时间......这使得CPU核心运行程序“旋转" 尽可能快地通过你的循环,每秒读取数百万次时间,希望它会滚动到结束时间。你需要告诉操作系统你想在一段时间后被唤醒......然后他们可以暂停你的程序并让其他程序运行(或系统空闲)......这就是其他中提到的各种睡眠功能答案是为了。

于 2010-11-05T06:12:14.653 回答
0

windows.h 中有 Sleep,在 *nix 上 unistd.h 中有 sleep。

有一个更优雅的解决方案@ http://www.faqs.org/faqs/unix-faq/faq/part4/section-6.html

于 2010-11-05T05:07:52.873 回答