밀리 초 동안 수면


631

POSIX sleep(x)기능으로 인해 프로그램이 x 초 동안 절전 모드로 전환됩니다. C ++에서 프로그램을 x 밀리 초 동안 절전 모드로 만드는 기능이 있습니까?


7
어쨌든 Windows Sleep()에서는 밀리 초 정밀도 가 있지만 정확도 는 수십 배 더 높을 수 있습니다. 당신은 4 밀리 초 동안 자고 있다고 생각할 수 있지만 실제로는 400 분 동안 자고 있습니다.
John

5
@ John Dibling : "x 초"가 주어진 sleepwin32가 아닌 POSIX를 사용하고 있다고 생각 Sleep합니다.
CB Bailey

1
C와 C ++의 이름 맹 글링은 버그와 비 호환성의 원인이 될 수 있지만, 대부분의 경우 C ++에서 C 헤더를 사용하는 것이 좋습니다. 그러나 아무것도 잘못되지 않도록 #include하려면 extern "C" {}블록 내부의 C 헤더를 사용하십시오 . 또한 동일한 프로젝트에 C 및 C ++ 소스 파일이있는 경우 특히 두 종류의 소스 파일에 동일한 헤더를 포함하는 경우 문제를 방지하기 위해이 작업을 수행하는 것이 좋습니다 (이 경우 필요한 경우). . 순전히 C ++ 프로젝트가 있다면 전혀 문제없이 작동 할 수 있습니다.
adam10603

2
@JohnDibling 아니오, 400ms가 아닙니다. 지금까지 얻을 수있는 최악의 정밀도 GetTickCount는 55ms 해상도의 Windows 9x에서 얻은 것입니다 . 이후 버전은 16ms 이하의 해상도를 가졌습니다. 한 사용자 는 자신이 Sleep에서 16ms의 해상도를 얻는다고 생각 했지만 그 Sleep자체가 상당히 정확하고 GetTickCount시간의 경과를 측정하는 데 사용하여 명백한 부정확성이 발생 했다고보고했습니다 .
Qwertie

답변:


457

밀리 초에 대한 표준 C API가 없으므로 (UNIX에서)에 대해 설정해야합니다 usleep.

#include <unistd.h>

unsigned int microseconds;
...
usleep(microseconds);

2
바쁜 잠입니까? 수면 중에 다른 스레드에 양보해야합니다. 나는 그것을 위해 사용할 수 usleep있습니까?
Michael

13
그것은 바쁜 대기 아니다 stackoverflow.com/a/8156644/1206499 하고 nanosleep있기 때문에 더 나은 선택이 될 수 있습니다 usleep되지 않습니다.
jswetzen 님이

4
C ++ 11 컴파일러를 사용하는 경우 이식성이 뛰어난 @ HighCommander4의 답변을 언급하는 것을 고려하십시오.
einpoklum

6
usleep ()은 2001 년 POSIX에서 더 이상 사용되지 않고 2008 년에 제거되었습니다.
Jetski S-type

1270

C ++ 11에서는 표준 라이브러리 기능으로이를 수행 할 수 있습니다.

#include <chrono>
#include <thread>
std::this_thread::sleep_for(std::chrono::milliseconds(x));

명확하고 읽기 쉬우므로 더 이상 sleep()함수의 단위를 추측 할 필요가 없습니다 .


6
std :: this_thread :: sleep_for가 중단 지점을 정의합니까? boost :: this_thread_sleep처럼?
Martin Meeser

73
이것이 올바른 방법입니다. 기간. 스레드는 크로스 플랫폼과 크로노입니다.
Void

88
@빈. 확실히 좋은 방법이지만 "the"와 "period"는 굉장히 강한 단어입니다.
Mad Physicist

5
바쁜 잠입니까? 수면 중에 다른 스레드에 양보해야합니다. 나는 그것을 위해 사용할 수 sleep_for있습니까?
Michael

14
@ 마이클 : 그것은 바쁜 수면이 아니므로 다른 스레드에 양보합니다.
HighCommander4

83

휴대 성을 유지하려면 Boost :: Thread for sleep을 사용할 수 있습니다 .

#include <boost/thread/thread.hpp>

int main()
{
    //waits 2 seconds
    boost::this_thread::sleep( boost::posix_time::seconds(1) );
    boost::this_thread::sleep( boost::posix_time::milliseconds(1000) );

    return 0;
}

이 답변은 중복 된 것이며 이전 에이 질문 에 게시되었습니다 . 아마도 거기에서 유용한 답변을 찾을 수도 있습니다.


6
멀티 스레드 환경에서 boost::this_thread::sleep코드에 중단 지점을 추가한다는 점을 명심하십시오 . boost.org/doc/libs/1_49_0/doc/html/thread/…
Martin Meeser

35

유닉스에서는 usleep 을 사용할 수 있습니다 .

Windows에는 절전 모드가 있습니다.


4
Windows 호출은 밀리 초입니다.
shindigo

17
<unistd.h> 또는 <Windows.h>를 각각 포함해야합니다.
gbmhunter

예, 그러나 실제 시간 해상도는 15-16ms (통화 단위가 1ms 인 경우에도)가 아니므로 최소 시간은 15-16ms 일 수 없습니까?
Peter Mortensen

33

플랫폼에 따라 가지고 usleep있거나 nanosleep사용할 수 있습니다. usleep더 이상 사용되지 않으며 최신 POSIX 표준에서 삭제되었습니다. nanosleep선호됩니다.


6
while usleep()가에 선언되어 <unistd.h>있고 혼동되게 / nanosleep()가 선언되어 있습니다. <time.h><ctime>
gbmhunter

27

time.h 라이브러리를 사용하지 않는 이유는 무엇입니까? Windows 및 POSIX 시스템에서 실행됩니다.

#include <iostream>
#include <time.h>

using namespace std;

void sleepcp(int milliseconds);

void sleepcp(int milliseconds) // Cross-platform sleep function
{
    clock_t time_end;
    time_end = clock() + milliseconds * CLOCKS_PER_SEC/1000;
    while (clock() < time_end)
    {
    }
}
int main()
{
    cout << "Hi! At the count to 3, I'll die! :)" << endl;
    sleepcp(3000);
    cout << "urrrrggghhhh!" << endl;
}

수정 된 코드-이제 CPU가 유휴 상태에 있습니다 [2014.05.24] :

#include <iostream>
#ifdef _WIN32
    #include <windows.h>
#else
    #include <unistd.h>
#endif // _WIN32

using namespace std;

void sleepcp(int milliseconds);

void sleepcp(int milliseconds) // Cross-platform sleep function
{
    #ifdef _WIN32
        Sleep(milliseconds);
    #else
        usleep(milliseconds * 1000);
    #endif // _WIN32
}
int main()
{
    cout << "Hi! At the count to 3, I'll die! :)" << endl;
    sleepcp(3000);
    cout << "urrrrggghhhh!" << endl;
}

24
이 코드의 문제점 중 하나는 사용 중 루프이므로 단일 프로세서 코어의 100 %를 계속 사용한다는 것입니다. 휴면 기능은 현재 스레드를 휴면하고 다른 작업을 수행하는 OS 호출을 중심으로 구현되며 지정된 시간이 만료되면 스레드를 깨 웁니다.
이스마엘

맞습니다-하나의 CPU 코어를 100 % 소비합니다. 시스템 슬립 기능을 사용하여 코드를 다시 작성했습니다 – 그리고 여전히 크로스 플랫폼입니다 :
Bart Grzybicki

@BartGrzybicki 나는 이것이 오래된 대답이라는 것을 알고 있지만 Windows 컴퓨터의 Visual Studio 2017 #ifdef WIN32에서는 기본적으로 true로 평가되지 않습니다.
kayleeFrye_onDeck

2
@kayleeFrye_onDeck 코드가 잘못되었습니다. 이어야합니다 #ifdef _WIN32.
Contango

1
@Contango 나는 그것을 알고 있었다! 하지만 내가 썼을 때가 아니라 ... lol. 후속 감사합니다!
kayleeFrye_onDeck

17

nanosleep보다 나은 선택입니다 usleep-인터럽트에 대해 더 탄력적입니다.


6
나는 잘 알고 usleep있었지만 그렇지 않았다 nanosleep. Linux에서이를 사용하는 예를 제공해야합니다.
jww

14
#include <windows.h>

통사론:

Sleep (  __in DWORD dwMilliseconds   );

용법:

Sleep (1000); //Sleeps for 1000 ms or 1 sec

3
이를 위해 무엇을 포함해야합니까?
ʇolɐǝz ǝɥʇ qoq

#include <WinBase.h>
foobar

7
아니요,#include <windows.h>
ʇolɐǝz ǝɥʇ qoq

7
이 질문은 POSIX 솔루션이 필요하다는 것을 강력하게 암시합니다.
Toby Speight

7

MS Visual C ++ 10.0을 사용하는 경우 표준 라이브러리 기능으로이를 수행 할 수 있습니다.

Concurrency::wait(milliseconds);

필요할 것이예요:

#include <concrt.h>

10
실제로 의미하지 않을 때는 "표준"이라는 단어를 사용하지 마십시오. 표준 라이브러리 헤더 <concrt.h>아닙니다 -플랫폼 라이브러리 일 수 있습니다. 이 경우 전제 조건을 명확하게 설명해야합니다.
Toby Speight

5

select기능 (POSIX, Linux 및 Windows)이있는 플랫폼에서 다음을 수행 할 수 있습니다.

void sleep(unsigned long msec) {
    timeval delay = {msec / 1000, msec % 1000 * 1000};
    int rc = ::select(0, NULL, NULL, NULL, &delay);
    if(-1 == rc) {
        // Handle signals by continuing to sleep or return immediately.
    }
}

그러나 요즘에는 더 나은 대안이 있습니다.


Windows 시스템에서 VS2017에서 컴파일 할 수없는 경우 :error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
kayleeFrye_onDeck

@kayleeFrye_onDeck 컴파일합니다. 연결되지 않습니다. Windows 문서를 찾아보십시오.
Maxim Egorushkin 2018 년

timeval에 어떤 헤더를 사용합니까 ??
토트 칼슨

@TotteKarlsson <sys/time.h>.
Maxim Egorushkin

4

C ++에서 프로그램을 잠자기하는 Sleep(int)방법 은 방법입니다. 헤더 파일은#include "windows.h."

예를 들면 다음과 같습니다.

#include "stdafx.h"
#include "windows.h"
#include "iostream"
using namespace std;

int main()
{
    int x = 6000;
    Sleep(x);
    cout << "6 seconds have passed" << endl;
    return 0;
}

잠자는 시간은 밀리 초 단위로 측정되며 제한이 없습니다.

Second = 1000 milliseconds
Minute = 60000 milliseconds
Hour = 3600000 milliseconds

3
제한이 없다는 것은 무엇을 의미합니까? 반드시 0xFFFFFFFE 인 한계가 있습니다. 0xFFFFFFFF를 기다리면 시간이 초과되지 않습니다 (즉, 프로그램이 끝날 때까지 기다립니다).
Izzy

나는 그것이 Izzy와 같은 것을 의미하지 않았습니다. 우리의 오해에 대해 죄송합니다. 양수의 밀리 초를 입력 할 수 있음을 의미했습니다. 따라서 프로그램을 닫는 데 수 밀리 초가 걸립니다. 이해가되지 않으면 말씀해주십시오. 더 설명하겠습니다.

예,하지만 실제 시간 해상도는 얼마입니까? 경우에 따라 15-16ms가되지 않았습니까? 예를 들어, Sleep (3)을 사용하면 실제로 3ms 동안 절전 상태가됩니까? 대신 15-16ms입니까?
Peter Mortensen

3

셀렉트 콜은보다 정밀한 방법입니다 (수면 시간은 나노초로 지정할 수 있음).


이것이 문제를 해결하기위한 귀중한 힌트 일 수도 있지만, 좋은 대답도 해결책을 보여줍니다. 의미를 나타내는 예제 코드를 제공하도록 편집 하십시오 . 또는 이것을 주석으로 작성해보십시오.
Toby Speight

3

Boost 비동기 입력 / 출력 스레드를 사용하고 x 밀리 초 동안 휴면 상태를 유지하십시오.

#include <boost/thread.hpp>
#include <boost/asio.hpp>

boost::thread::sleep(boost::get_system_time() + boost::posix_time::millisec(1000));

3 밀리 초 동안 자려고하면 실제로 어떻게됩니까? 대신 15-16 밀리 초입니까? 당신은 그것을 측정 했습니까?
Peter Mortensen

1

문제는 오래되었지만 앱에서이를 수행하는 간단한 방법을 알아 냈습니다. 아래와 같이 C / C ++ 매크로를 만들 수 있습니다.

#ifndef MACROS_H
#define MACROS_H

#include <unistd.h>

#define msleep(X) usleep(X * 1000)

#endif // MACROS_H

1

std 및 숫자 리터럴을 사용하는 C ++ 14에서 :

#include <chrono>
#include <thread>

using namespace std::chrono;

std::this_thread::sleep_for(123ms);

0

POSIX 시스템의 Win32 대체품 :

void Sleep(unsigned int milliseconds) {
    usleep(milliseconds * 1000);
}

while (1) {
    printf(".");
    Sleep((unsigned int)(1000.0f/20.0f)); // 20 fps
}

고향 nanosleep()usleep(): 후자는 사용되지 않으며 가장 최근의 POSIX 표준에서 삭제되었습니다.
Toby Speight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.