Як додати приурочену затримку до програми на C ++?


93

Я намагаюся додати приурочену затримку в програмі на C ++, і мені було цікаво, чи є у когось якісь пропозиції щодо того, що я можу спробувати, або інформації, яку я можу подивитися?

Я хотів би мати більше деталей про те, як я впроваджую цю затримку, але поки я не отримаю більше інформації про те, як додати приурочену затримку, я не впевнений у тому, як мені взагалі намагатися це реалізувати.


2
Це залежить від того, яка платформа (ОС) і які бібліотеки у вас є.
Скотт Ленгем,

Відповіді:


80

Win32: Sleep(milliseconds)це те, що ти що

unix: usleep(microseconds)це те, що ви хочете.

sleep () займає лише секунду, яка часто буває занадто довгою.


3
Існує також nanosleep (), якщо usleep () не дає вам достатньої роздільної здатності.
Крістофер Джонсон,

9
Майте на увазі, що аргументом цих функцій є МІНІМАЛЬНИЙ час сну, і НЕ гарантуйте, що ви повернетесь відразу, якщо в той час інший процес затягує центральний процесор.
billjamesdev

1
@Richard Harrison: Який заголовок я повинен включити, щоб sleep () працював?
Перелив

12
@Overflowh на win32 Sleep () знаходиться у windows.h; on unix sleep () in unistd.h
Річард Гаррісон,

1
@TommasoTheaCioni Добре, я припускаю, ви маєте на увазі: "Як я можу змусити програму перезапуститися саме з затримкою?", І відповідь ... ви не можете. Ви не керуєте операційною системою настільки сильно. Якщо якась інша програма знаходиться в середині якогось критичного сегменту, ваша програма просто повинна почекати.
billjamesdev

136

Оновлена ​​відповідь для C ++ 11:

Використовуйте функції sleep_forта sleep_until:

#include <chrono>
#include <thread>

int main() {
    using namespace std::this_thread; // sleep_for, sleep_until
    using namespace std::chrono; // nanoseconds, system_clock, seconds

    sleep_for(nanoseconds(10));
    sleep_until(system_clock::now() + seconds(1));
}

Чи не З допомогою цих функцій більше немає необхідності постійно додавати нові функції для кращого дозволу: sleep, usleep, nanosleepі т.д. , sleep_forі sleep_untilє функціями шаблонів , які можуть приймати значення будь-якого дозволу по chronoтипам; годин, секунд, фемтосекунд тощо.

У C ++ 14 ви можете додатково спростити код буквальними суфіксами для nanosecondsта seconds:

#include <chrono>
#include <thread>

int main() {
    using namespace std::this_thread;     // sleep_for, sleep_until
    using namespace std::chrono_literals; // ns, us, ms, s, h, etc.
    using std::chrono::system_clock;

    sleep_for(10ns);
    sleep_until(system_clock::now() + 1s);
}

Зверніть увагу, що фактична тривалість сну залежить від реалізації: Ви можете попросити спати 10 наносекунд, але реалізація може закінчитися сном на мілісекунді, якщо це найкоротший час.


4
Суффікси, визначені користувачем. Вони копали ... занадто глибоко.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

33
#include <unistd.h>
usleep(3000000);

Це також буде спати протягом трьох секунд. Ви можете дещо більше уточнити цифри.


Дякую! Просте і чисте рішення. Працював на Mac, компілюючи з G ++ VS Code.
Z41N

17

Ви хочете щось таке просте, як

sleep(3);

Це повинно було. Це майже універсально. На якій мові / компіляторі ви його спробували? Ви імпортували всі необхідні бібліотеки?
JJ

3
Я не міг зрозуміти, чому це не було позначено як відповідь чи не було дуже прихильним
ImranNaqvi

8

Зауважте, що це не гарантує, що кількість часу, коли потік сплять, буде десь близько до періоду сну, воно лише гарантує, що кількість часу до продовження потоку буде принаймні бажаною. Фактична затримка буде змінюватися залежно від обставин (особливо навантаження на машину, про яку йде мова) і може бути на порядки вищою, ніж бажаний час сну.

Крім того, ви не вказуєте, чому вам потрібно спати, але, як правило, слід уникати використання затримок як методу синхронізації.


4

Ви можете спробувати цей фрагмент коду:

#include<chrono>
#include<thread>

int main(){
    std::this_thread::sleep_for(std::chrono::nanoseconds(10));
    std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::seconds(1));
}

3

Ви також можете використовувати select (2), якщо вам потрібна мікросекундна точність (це працює на платформі, яка не має usleep (3))

Наступний код буде чекати 1,5 секунди:

#include <sys/select.h>
#include <sys/time.h>
#include <unistd.h>`

int main() {
    struct timeval t;
    t.tv_sec = 1;
    t.tv_usec = 500000;
    select(0, NULL, NULL, NULL, &t);
}

`


3

Так, сон, мабуть, тут функція вибору. Зверніть увагу, що час, переданий функції, - це найменша кількість часу, коли викличний потік буде неактивним. Так, наприклад, якщо ви викликаєте сплячий режим із 5 секундами, ви гарантуєте, що ваша нитка буде спати принаймні 5 секунд. Може бути 6, або 8 або 50, залежно від того, що робить ОС. (Під час оптимального виконання ОС це буде дуже близько до 5.)
Ще однією корисною функцією функції сну є передача через 0. Це змусить переключити контекст з вашого потоку.

Деяка додаткова інформація:
http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html


3

Я виявив, що "_sleep(milliseconds);"(без лапок) добре працює для Win32, якщо включити chronoбібліотеку

Наприклад:

#include <chrono>

using namespace std;

main
{
    cout << "text" << endl;
    _sleep(10000); // pauses for 10 seconds
}

Не забудьте включити підкреслення перед сном.


Цю функцію замінили новіші функції бібліотеки або операційної системи. Подумайте про використання режиму сну.
ByWaleed

3

щоб затримати вихід у cpp на фіксований час, ви можете використовувати функцію Sleep (), включивши синтаксис файлу заголовка windows.h для функції Sleep (): Sleep (time_in_ms) як

cout<<"Apple\n";
Sleep(3000);
cout<<"Mango";

ВИХІД. наведений вище код надрукує Apple і зачекає 3 секунди, перш ніж друкувати Mango.


2

Тут головна відповідь, здається, залежить від ОС; для більш портативного рішення ви можете записати функцію швидкого сну, використовуючи файл заголовка ctime (хоча це може бути поганою реалізацією з мого боку).

#include <iostream>
#include <ctime>

using namespace std;

void sleep(float seconds){
    clock_t startClock = clock();
    float secondsAhead = seconds * CLOCKS_PER_SEC;
    // do nothing until the elapsed time has passed.
    while(clock() < startClock+secondsAhead);
    return;
}
int main(){

    cout << "Next string coming up in one second!" << endl;
    sleep(1.0);
    cout << "Hey, what did I miss?" << endl;

    return 0;
}

0

Синтаксис:

нічний сон (секунди без підпису);

sleep () призупиняє виконання на проміжок часу (секунди). Під час виклику режиму сну поточна програма призупиняється до виконання протягом кількості секунд, вказаних аргументом секунди. Інтервал точний лише з точністю до сотих секунди або до точності годинника операційної системи, залежно від того, що менш точне.


0

Багато хто надав хорошу інформацію про сон. Я погоджуюсь з Кліном, що сон рідко є найбільш підходящим рішенням.

Якщо ви спите, коли чогось чекаєте, то вам краще насправді чекати цієї речі / події. Подивіться на змінні умови для цього.

Я не знаю, в якій ОС ви намагаєтесь це зробити, але для потоків та синхронізації ви можете звернутися до бібліотек Boost Threading ( зміна стану посилення ).

Переходячи зараз до іншої крайності, якщо ви намагаєтесь почекати виключно короткі періоди, тоді є кілька варіантів стилю хак. Якщо ви працюєте на якійсь вбудованій платформі, де `` сплячий режим '' не реалізований, ви можете спробувати простий цикл (for / while тощо) з порожнім тілом (будьте обережні, компілятор не оптимізує його). Звичайно, час очікування залежить від конкретного обладнання в даному випадку. Для дуже коротких "очікувань" ви можете спробувати монтажний "nop". Я дуже сумніваюся, що це те, чим ви займаєтесь, але не знаючи, чому вам потрібно чекати, важко бути конкретнішим.


0

У Windows ви можете включити бібліотеку Windows і використовувати "Sleep (0);" спати програму. Це приймає значення, яке представляє мілісекунди.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.