【问题标题】:How do I create a timer? (Do something every X seconds/minutes/hours)如何创建计时器? (每 X 秒/分钟/小时做一件事)
【发布时间】:2011-06-18 20:12:33
【问题描述】:

我需要每 10 秒在我的程序中执行一次操作,但我不知道如何在 C++ 控制台应用程序中执行此操作。在 C# 中,我可以创建一个计时器,但我现在在这里挣扎......

睡眠();不是一个选项,因为据我所知,它会使您的程序在 X 秒内处于非活动状态,我需要我的应用程序处于活动状态并且可以正常工作,并且一直在计算。

请帮我解决这个小(或大?)问题,我对 C++ 和学习 ATM 很陌生:)

所以我已经设置了 BOOST 库,现在我正在做这样的事情。

boost::timer t;

while (true)
{
    if (t.elapsed() > 1)
    {
        cout << t.elapsed() << endl;
        t.restart();
    }
}

它足够好还是应该有更好的方法?哦不,这很糟糕,不停地吃掉我 25% 的 CPU。 :(

【问题讨论】:

  • sleep() 是一个选项,如果你把它放在一个单独的线程中。
  • 这 10 秒必须有多精确?由于您的应用程序“一直在计算”,您可能只需在其中一个外部循环中抛出一个 if 语句,检查当前时间,如果它在预定时间之后,则调用周期性工作函数并调整预定时间下次它应该运行。
  • PigBen 和 Ben 都说过,需要多精确?如果您只在一个线程中,您可能可以在那里进行某种睡眠(10ms 可能会这样做)。在 Windows 中它看起来像 Sleep(10); 或在 *nix 中它看起来像 usleep(10*1000); // 10microseconds * 1000 = 10 milliseconds

标签: c++


【解决方案1】:

Boost 有一个计时器库。

事实上,如果您还没有接触过 Boost,我相信您会发现它非常有用。


要创建基于事件的计时器,您应该查看this answer

【讨论】:

  • 谢谢,我想我会坚持使用 Boost。看起来功能很丰富,用起来也不是那么难。
  • 嘿,所以我启动并运行了它,现在我看到了计时器。请看看我的计时器方法是否足够好:)
【解决方案2】:

简单的方法是创建一个新线程(man pthreads,如果您使用的是Linux)并在其中执行此操作。

这里是一些关于如何使用 POSIX 线程的信息和示例 - http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_create.3.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多