【问题标题】:is there a loop controlled by time in c++?c++中有时间控制的循环吗?
【发布时间】:2011-04-06 20:17:53
【问题描述】:

我想知道是否可以在每个循环之间的一分钟间隔内循环 x 次。

for (int x = 10; x > 0; x--)
{
     cout << "BOOM" << endl;
}

有什么方法可以让我每分钟打印一次繁荣? 还是有更好的方法来做到这一点?

谢谢

【问题讨论】:

    标签: c++ loops controls time for-loop


    【解决方案1】:

    我认为这应该可行:

    #include <sleep.h>
    ...
    
    for (int x = 10; x > 0; x--)
    {
        cout << "BOOM" << endl;
        sleep(60);
    }
    

    【讨论】:

    • 我认为这对我有用,因为它只是一个用于学校作业的模拟程序,谢谢你们
    【解决方案2】:

    唯一的标准方法是使用睡眠功能。

    for (int x = 10; x > 0; x--)
    {
         cout << "BOOM" << endl;
         sleep(60); // 1 minute
    }
    

    【讨论】:

    • 这看起来像 POSIX 中的 sleep(3),需要几秒钟。 Windows 的毫秒睡眠用大写字母 S 拼写。
    【解决方案3】:

    标准 C++ 没有这样的功能。您可以做的最接近的事情是无限循环不断询问是否已经过去了。

    C++0x 标准草案在标题 &lt;thread&gt; 下有 sleep_until()sleep_for(),但是您的实现可能还不支持这些功能(它们还不是标准的),而且可能还有更多工作要做比它的价值。

    请查阅您的实施文档。可能有一个 sleep() 函数或类似的东西,你可以在你的循环中放入类似 sleep(60) 的东西。

    【讨论】:

    • 小记:我们没有使用实时操作系统,因此大约需要 60 秒,没有太多选择可以做得更好。
    【解决方案4】:

    您应该使用计时器或至少测量时间...您可以将其用于毫秒精度:

    /* microtimer.c - function to get microsecond exact times for measure */
    
    /* System specific headers */
    #ifdef WIN32
        #include <windows.h>
    #else
        #include <sys/time.h>
    #endif
    
    double getMicroTime(void) {
    #ifdef WIN32
            LARGE_INTEGER frequency; /* ticks per second */
            LARGE_INTEGER time;
    
            QueryPerformanceFrequency(&frequency);
            QueryPerformancetimeer(&time);
    
            return time.QuadPart * (1000000.0 / frequency.QuadPart);
    #else
            struct timeval time;
    
            gettimeofday(&time,0); /* 0 instead of NULL to reduce stdlib */
    
            return (time.tv_sec * 1000000.0) + time.tv_usec;
    #endif
    }
    

    【讨论】:

    • 首先,这是特定于 Microsoft Windows 的。其次,它没有解决如何等待的问题。知道现在是最接近的毫秒时间对于小睡 60 秒并不是很有用。
    • @David Thornley:它并不具体,这就是发布它的重点! 适用于 unix 上的等价物!我认为拥有这样一个包装器可能很有用,谁知道呢?它精确,可能对人有用......你可以用它来解决问题!
    【解决方案5】:

    我不相信 C++ 中有任何本机构造可以让您做到这一点。有其他人展示的sleep() 函数可以在循环中使用。如果您的需求如此严格,您可能还想寻找一个可能具有更好功能的实时库(不幸的是,我已经很长时间没有从事这方面的工作了,所以我不知道当前的好用的库)。如果您不介意为定时过程创建线程,一些线程库也可能提供此功能。

    【讨论】:

      【解决方案6】:

      如果您想根据经过的时间循环某些内容,您可能会发现计时器很有用。 定时器在大多数 API 中都可用,例如 Win32API。

      【讨论】:

        【解决方案7】:

        正如 rhino 所说,计时器最有可能是您想要使用的。

        如果这是一个控制台应用程序,那么 sleep() 样式的延迟可能是可以接受的。

        但是,如今大多数应用程序都是 GUI 应用程序,对于那些您不希望阻止处于 sleep() 调用的进程的应用程序。

        您要做的是设置一个计时器,然后在计时器事件处理程序中执行一次操作。最后一次完成后,禁用计时器。这允许 GUI 事件循环继续处理事件,并且它可以防止您的应用程序在它处于睡眠状态时出现锁定。

        如果您需要更好的时间精度,您还可以在工作线程中运行 sleep() 方法。但是,使用任何常规方法都不会获得优于 10-50 毫秒(可能更糟)的时间精度。对于大多数用途来说,这应该是非常好的。

        如果您需要良好的累积时间跟踪(例如您在时钟上画指针),您应该在计时器或工作线程中获取当前系统时间,并使用该数字来调整等待下一次通过的时间.否则,由于计时器(和 sleep())将在“计时器/睡眠持续时间完成后尽快”被触发,因此您将慢慢增加这些额外的延迟,并且它的运行速度将比您预期的要慢。例如:sleep(1000) 可能会休眠 1000 毫秒,或更可能是 1005、1015、1021 等。计时器的行为类似。

        有很多方法可以做定时器(Win32、Qt、boost 等),管理线程的方法也同样多。因此,我们需要更多地了解您正在使用哪种平台才能进一步回答。

        【讨论】:

          猜你喜欢
          • 2014-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多