Есть ли цикл, контролируемый временем в C ++? - PullRequest
4 голосов
/ 01 сентября 2010

Мне интересно, могу ли я повторять x раз с интервалом в одну минуту между каждым циклом.

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

Можно ли печатать бумагу каждую минуту?Или есть лучший способ сделать это?

Спасибо

Ответы [ 7 ]

3 голосов
/ 01 сентября 2010

Стандарт C ++ не имеет такой функции. Самое близкое, что вы могли бы сделать - это иметь бесконечный цикл, постоянно спрашивающий, прошла ли минута.

Черновой стандарт C ++ 0x содержит sleep_until() и sleep_for() в заголовке <thread>, но ваша реализация может еще не поддерживать эти функции (они все еще не являются стандартными), и это может потребовать больше усилий чем это стоит.

Обратитесь к документации по реализации. Вероятно, есть функция sleep () или что-то в этом роде, и вы можете поместить что-то вроде sleep(60) в ваш цикл.

0 голосов
/ 01 сентября 2010

Как сказал носорог, наиболее вероятно, что вы хотите использовать таймеры.

Если это консольное приложение, то задержки в стиле sleep () могут быть приемлемыми.

Однако,большинство приложений в настоящее время являются приложениями с графическим интерфейсом, и для них вам НЕ нужно блокировать процесс, сидящий на вызове sleep ().

Что вам нужно сделать, так это настроить таймер и таймерОбработчик событий вы выполняете один проход вашего действия.Когда последний проход сделан, отключите таймер.Это позволяет циклу событий графического интерфейса пользователя продолжать обработку событий и предотвращает блокировку приложения во время сна.

Если вам нужна лучшая точность времени, вы также можете запустить метод sleep () на рабочем месте.нить.Тем не менее, вы не получите точность времени лучше, чем 10-50 мс (потенциально намного хуже) с любым нормальным методом.Это должно быть прекрасно для большинства применений.

Если вам нужно хорошее совокупное отслеживание времени (скажем, вы рисуете стрелки на часах), вы должны получить текущее системное время внутри своего таймера или рабочего потока и использовать это число, чтобы отрегулировать, как долго вы ждетеследующий проходВ противном случае, поскольку таймеры (и sleep ()) будут срабатывать «как можно скорее после завершения времени таймера / сна», вы будете медленно добавлять эти дополнительные задержки и работать медленнее, чем вы предполагали.Пример: sleep (1000) может спать в течение 1000 мс, или, более вероятно, что-то вроде 1005, 1015, 1021 и т. Д. Таймеры будут вести себя аналогично.

Есть много способов сделать таймеры (Win32, Qt, boost,и т. д.) и столь же большое количество способов управления потоками.Поэтому нам нужно больше узнать о том, с какой платформой вы работаете, чтобы ответить дальше.

0 голосов
/ 01 сентября 2010

Если вы хотите зациклить что-либо в зависимости от прошедшего времени, вы можете найти таймеры полезными.Таймеры доступны в большинстве API, таких как Win32API.

0 голосов
/ 01 сентября 2010

Я не верю, что в C ++ есть какая-либо нативная конструкция, которая позволяет вам это делать.Есть функция sleep(), которую, как показали другие, можно использовать в цикле.Возможно, вы также захотите найти библиотеку в реальном времени, которая может иметь лучшие возможности, если ваши потребности настолько строги (к сожалению, я давно не работал над этим, поэтому я не знаю текущих хороших).Некоторые библиотеки потоков также могут предложить это, если вы не против создать потоки для ваших процедур по времени.

0 голосов
/ 01 сентября 2010

Вы должны использовать таймеры или, по крайней мере, измерить время ... вы можете использовать это с точностью до миллисекунды:

/* 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
}
0 голосов
/ 01 сентября 2010

Единственным стандартным способом является использование функции сна.

for (int x = 10; x > 0; x--)
{
     cout << "BOOM" << endl;
     sleep(60); // 1 minute
}
0 голосов
/ 01 сентября 2010

Я думаю, что это должно работать:

#include <sleep.h>
...

for (int x = 10; x > 0; x--)
{
    cout << "BOOM" << endl;
    sleep(60);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...