2012-06-06 5 views
31

매크로를 사용하여 크로스 플랫폼 수면 코드를 만들 수 있습니까? 예를크로스 플랫폼 C++ 용 수면 기능

#ifdef LINUX 
#include <header_for_linux_sleep_function.h> 
#endif 
#ifdef WINDOWS 
#include <header_for_windows_sleep_function.h> 
#endif 
... 
Sleep(miliseconds); 
... 
+0

, 당신은''를 사용할 수 있습니다. – chris

+12

왜 프로세서를 왜곡 시키시겠습니까? C++ 11을 사용한다면'std :: this_thread :: sleep_for (std :: chrono :: milliseconds (n))'와 같은 것을 사용할 수 있습니다. 이것은 CPU를 소비해서는 안됩니다. –

+0

은 순수한 C++입니다. – ElSajko

답변

36

예 있습니다.

#ifdef LINUX 
#include <unistd.h> 
#endif 
#ifdef WINDOWS 
#include <windows.h> 
#endif 

void mySleep(int sleepMs) 
{ 
#ifdef LINUX 
    usleep(sleepMs * 1000); // usleep takes sleep time in us (1 millionth of a second) 
#endif 
#ifdef WINDOWS 
    Sleep(sleepMs); 
#endif 
} 

그런 다음 코드가 직접 시스템 호출을하기보다는 잠을 mySleep를 호출 당신이 할 것은 다른 시스템이 자신의 함수 호출뿐만 아니라 다음과 같은 포함 문을 잠 포장입니다.

+7

#ifdef LINUX int 절전 모드 (int sleepMs) {return usleep (sleepMs * 1000); } #endif – Joshua

+0

예, 좋을 지 몰라도, usleep은 CPU를 소비하지 않습니다. 예 : while (1) {usleep (1000 * 1000);/* 1sec? */cout << 1; } 그리고 나서 1 초 후에 출력은 많은 "1"문자입니다. – ElSajko

+0

@KamilKrzyszczuk : 아니요,'usleep'은 CPU를 소비하지 않고 잠시 동안 프로세스를 완전히 멈 춥니 다. –

18

를 들어 는 Boost를 가져옵니다.

#include <boost/thread/thread.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
... 
boost::this_thread::sleep(boost::posix_time::millisec(milliseconds)); 
+6

이제 C++ 11입니다. 'posix_time'은'chrono'라고합니다. – anthropomorphic

8

스톡 솔루션은 select() 호출입니다 (Winsock 필요). 이 특정 호출은 Linux와 Windows에서 똑같은 동작을합니다.

long value; /* time in microseconds */ 

struct timeval tv; 
tv.tv_sec = value/1000000; 
tv.tv_usec = value % 1000000; 
select(0, NULL, NULL, NULL, &tf); 
+0

흥미로운 솔루션이지만'shf301'의 대답에 대한 여러분의 의견이 더 마음에 들었습니다. –

1

리눅스에서는 휴면에 한계가 있음을 기억하십시오. 1000 초 이상 '대기'할 수 없습니다.

나는 그래이

struct timespec req={0},rem={0}; 
req.tv_sec=(milisec/1000); 
req.tv_nsec=(milisec - req.tv_sec*1000)*1000000; 
nanosleep(&req,&rem); 
47

과 같이 작성합니다. 그러나 이는 C++11later에서만 작동합니다. ms 당신이 밀리 초 단위로 자고 싶어 시간이

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

.

또한 nanoseconds, microseconds, seconds, minutes, 또는 hoursmilliseconds을 대체 할 수 있습니다. (이러한 유형 std::chrono::duration의 전문입니다.)

업데이트 : 당신이 예를 100 밀리 초 동안, 일정 시간 동안 잠을자는 경우C++14에서, std::chrono::milliseconds(100)100ms과 같이 쓸 수있다. 이는 user defined literals으로 인해 C++11에 도입되었습니다.

01 : C++14에서 chrono 라이브러리는 다음과 같은 사용자 정의 리터럴을 포함하도록 확장 된

효과적으로 이것은 다음과 같이 작성할 수 있음을 의미합니다. using namespace std::literals::chrono_literalsnamespace pollution의 최소 금액을 제공하는 반면,

#include <chrono> 
#include <thread> 
using namespace std::literals::chrono_literals; 

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

참고 이러한 연산자는 경우 using namespace std::literals 가능, 또는 using namespace std::chrono 있습니다.

19

shf301 좋은 생각을했지만,이 방법은 더 나은 :

#ifdef _WINDOWS 
#include <windows.h> 
#else 
#include <unistd.h> 
#define Sleep(x) usleep((x)*1000) 
#endif 

다음과 같이 사용합니다

Sleep(how_many_milliseconds); 
+1

편리! 고맙습니다! :) – cmcromance

-2

그냥 할

현재 시간을 확인
#include <ctime> 
int Sleep(int ms) 
{ 
    clock_t starting = clock(); 
    while(clock() - starting < ms) {} 
    return 0; 
} 

(밀리 초 단위), 시작 시간을 뺍니다.이 시간은 함수가 사용하는 시간을 나타냅니다. 이 숫자가 임계 값 (목표 시간 길이)보다 작 으면 아무 것도하지 않고 약간의 시간을 죽입니다. 그것은 시간이 임계 값을 초과 할 때까지 반복되고, 그 다음에 중지됩니다.

편집 : 당신이 떨어져 잉 프로세서를 신경 및 C++ (11)가없는 경우 고정 코드 실수

관련 문제