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_forsleep_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_forsleep_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.