C ++ 프로그램에 시간 지연을 어떻게 추가합니까?


95

C ++ 프로그램에 시간 지연을 추가하려고하는데, 누군가 내가 시도 할 수있는 것에 대한 제안이나 내가 볼 수있는 정보가 있는지 궁금합니다.

이 시간 지연을 구현하는 방법에 대한 자세한 내용을 알고 싶지만, 시간 지연을 추가하는 방법에 대한 자세한 정보를 얻을 때까지이를 구현하려고 시도해야할지 확신 할 수 없습니다.


2
플랫폼 (OS)과 사용 가능한 라이브러리에 따라 다릅니다.
— Scott Langham

답변:


79

Win32에서 :

#include<windows.h>
Sleep(milliseconds);

유닉스에서 :

#include<unistd.h>
unsigned int microsecond = 1000000;
usleep(3 * microsecond);//sleeps for 3 second

sleep() 너무 긴 시간은 몇 초 밖에 걸리지 않습니다.


3
usleep ()이 충분한 해상도를 제공하지 않는 경우 nanosleep ()도 있습니다.
— Kristopher Johnson

10
이러한 함수에 대한 인수는 최소 절전 시간이며, 다른 프로세스가 해당 시간에 CPU를 사용하는 경우 즉시 돌아올 것이라는 보장은 없습니다.
— billjamesdev

2
@Richard Harrison : sleep ()이 작동하도록하려면 어떤 헤더를 포함해야합니까?
— Overflowh

12
@Overflowh on win32 Sleep () is in windows.h; unistd.h의 유닉스 sleep ()
— Richard Harrison

1
@TommasoTheaCioni 좋아, " 지연시 정확히 프로그램을 다시 시작하려면 어떻게 해야하나요?"라고 생각하고 대답은 ... 할 수 없다는 것입니다. 그 정도까지 운영 체제를 제어 할 수 없습니다. 다른 프로그램이 중요한 세그먼트의 중간에 있으면 프로그램이 기다려야합니다.
— billjamesdev

139

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 郝海东 冠状 病 六四 事件 法轮功

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

이것은 또한 3 초 동안 잠을 자게됩니다. 하지만 숫자를 조금 더 다듬을 수 있습니다.


감사합니다! 간단하고 깨끗한 솔루션. G ++ VS Code로 Mac 컴파일에서 작업했습니다.
— Z41N

18

다음과 같이 간단한 것을 원하십니까?

#include <unistd.h>
sleep(3);//sleeps for 3 second

그래야한다. 거의 보편적입니다. 어떤 언어 / 컴파일러에서 사용해 보셨습니까? 필요한 라이브러리를 모두 가져 왔습니까?
— JJ

4
이 답변으로 표시하지 않거나 훨씬 upvoted되지 않은 이유를 나는 이해할 수 없었다
— ImranNaqvi

8

이것은 스레드가 휴면하는 시간이 휴면 기간에 가깝다는 것을 보장하지 않으며 스레드가 실행을 계속하기 전의 시간이 최소한 원하는 양이 될 것임을 보장 할뿐입니다. 실제 지연은 상황 (특히 문제의 기계에 가해지는 부하)에 따라 다르며 원하는 절전 시간보다 훨씬 더 높을 수 있습니다.

또한 수면이 필요한 이유를 나열하지 않지만 일반적으로 동기화 방법으로 지연을 사용하지 않아야합니다.


5

이 코드 조각을 시도해 볼 수 있습니다.

#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 초 동안 sleep을 호출하면 스레드가 최소 5 초 동안 절전 상태가 될 것입니다. OS가 수행하는 작업에 따라 6, 8 또는 50이 될 수 있습니다. (최적의 OS 실행 중에 이것은 5에 매우 가깝습니다.)
sleep 함수의 또 다른 유용한 기능은 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을 인쇄하고 Mango를 인쇄하기 전에 3 초 동안 기다립니다.


2

여기에서 가장 좋은 대답은 OS에 따라 달라지는 대답 인 것 같습니다. 더 이식 가능한 솔루션을 위해 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

통사론:

void sleep (unsigned seconds);

sleep ()은 간격 (초) 동안 실행을 일시 중단합니다. sleep을 호출하면 현재 프로그램이 seconds 인수에 지정된 시간 (초) 동안 실행에서 일시 중지됩니다. 간격은 가장 가까운 100 분의 1 초 또는 운영 체제 시계의 정확도 중 덜 정확합니다.


0

다른 많은 사람들이 수면에 대한 좋은 정보를 제공했습니다. 나는 수면이 가장 적절한 해결책이 거의 없다는 웨지에 동의합니다.

당신이 무언가를 기다리면서 잠을 자고 있다면, 실제로 그 일 / 이벤트를 기다리는 것이 낫습니다. 이에 대한 조건 변수를 살펴보십시오.

이 작업을 수행하려는 OS를 모르지만 스레딩 및 동기화를 위해 Boost Threading 라이브러리 ( Boost Condition Varriable )를 살펴볼 수 있습니다.

예외적으로 짧은 기간을 기다리려는 경우 다른 극단으로 이동하면 몇 가지 해킹 스타일 옵션이 있습니다. 'sleep'이 구현되지 않은 일종의 임베디드 플랫폼에서 작업하는 경우 빈 본문으로 간단한 루프 (for / while 등)를 시도 할 수 있습니다 (컴파일러가이를 최적화하지 않도록주의하십시오). 물론이 경우 대기 시간은 특정 하드웨어에 따라 다릅니다. 정말 짧은 '대기'를 위해 "nop"어셈블리를 시도 할 수 있습니다. 나는 이것이 당신이 추구하는 것임을 매우 의심하지만 왜 기다려야하는지 알지 못하면 더 구체적으로 말하기가 어렵습니다.


0

Windows에서는 Windows 라이브러리를 포함하고 "Sleep (0);"을 사용할 수 있습니다. 프로그램을 잘 수 있습니다. 밀리 초를 나타내는 값을 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.