매크로를 사용하여 크로스 플랫폼 수면 코드를 만들 수 있습니까? 예를크로스 플랫폼 C++ 용 수면 기능
#ifdef LINUX
#include <header_for_linux_sleep_function.h>
#endif
#ifdef WINDOWS
#include <header_for_windows_sleep_function.h>
#endif
...
Sleep(miliseconds);
...
매크로를 사용하여 크로스 플랫폼 수면 코드를 만들 수 있습니까? 예를크로스 플랫폼 C++ 용 수면 기능
#ifdef LINUX
#include <header_for_linux_sleep_function.h>
#endif
#ifdef WINDOWS
#include <header_for_windows_sleep_function.h>
#endif
...
Sleep(miliseconds);
...
예 있습니다.
이#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
를 호출 당신이 할 것은 다른 시스템이 자신의 함수 호출뿐만 아니라 다음과 같은 포함 문을 잠 포장입니다.
#ifdef LINUX int 절전 모드 (int sleepMs) {return usleep (sleepMs * 1000); } #endif – Joshua
예, 좋을 지 몰라도, usleep은 CPU를 소비하지 않습니다. 예 : while (1) {usleep (1000 * 1000);/* 1sec? */cout << 1; } 그리고 나서 1 초 후에 출력은 많은 "1"문자입니다. – ElSajko
@KamilKrzyszczuk : 아니요,'usleep'은 CPU를 소비하지 않고 잠시 동안 프로세스를 완전히 멈 춥니 다. –
를 들어 는 Boost를 가져옵니다.
#include <boost/thread/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
...
boost::this_thread::sleep(boost::posix_time::millisec(milliseconds));
이제 C++ 11입니다. 'posix_time'은'chrono'라고합니다. – anthropomorphic
스톡 솔루션은 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);
흥미로운 솔루션이지만'shf301'의 대답에 대한 여러분의 의견이 더 마음에 들었습니다. –
리눅스에서는 휴면에 한계가 있음을 기억하십시오. 1000 초 이상 '대기'할 수 없습니다.
나는 그래이
struct timespec req={0},rem={0};
req.tv_sec=(milisec/1000);
req.tv_nsec=(milisec - req.tv_sec*1000)*1000000;
nanosleep(&req,&rem);
과 같이 작성합니다. 그러나 이는 C++11 및 later에서만 작동합니다. ms
당신이 밀리 초 단위로 자고 싶어 시간이
#include <chrono>
#include <thread>
...
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
.
또한 nanoseconds
, microseconds
, seconds
, minutes
, 또는 hours
로 milliseconds
을 대체 할 수 있습니다. (이러한 유형 std::chrono::duration의 전문입니다.)
업데이트 : 당신이 예를 100 밀리 초 동안, 일정 시간 동안 잠을자는 경우는 C++14에서, std::chrono::milliseconds(100)
는 100ms
과 같이 쓸 수있다. 이는 user defined literals으로 인해 C++11에 도입되었습니다.
std::literals::chrono_literals::operator""h
std::literals::chrono_literals::operator""min
std::literals::chrono_literals::operator""s
std::literals::chrono_literals::operator""ms
std::literals::chrono_literals::operator""us
std::literals::chrono_literals::operator""ns
chrono
라이브러리는 다음과 같은 사용자 정의 리터럴을 포함하도록 확장 된
효과적으로 이것은 다음과 같이 작성할 수 있음을 의미합니다. using namespace std::literals::chrono_literals
이 namespace 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
있습니다.
shf301 좋은 생각을했지만,이 방법은 더 나은 :
#ifdef _WINDOWS
#include <windows.h>
#else
#include <unistd.h>
#define Sleep(x) usleep((x)*1000)
#endif
다음과 같이 사용합니다
Sleep(how_many_milliseconds);
편리! 고맙습니다! :) – cmcromance
그냥 할
현재 시간을 확인#include <ctime>
int Sleep(int ms)
{
clock_t starting = clock();
while(clock() - starting < ms) {}
return 0;
}
(밀리 초 단위), 시작 시간을 뺍니다.이 시간은 함수가 사용하는 시간을 나타냅니다. 이 숫자가 임계 값 (목표 시간 길이)보다 작 으면 아무 것도하지 않고 약간의 시간을 죽입니다. 그것은 시간이 임계 값을 초과 할 때까지 반복되고, 그 다음에 중지됩니다.
편집 : 당신이 떨어져 잉 프로세서를 신경 및 C++ (11)가없는 경우 고정 코드 실수
, 당신은''를 사용할 수 있습니다. –
chris
왜 프로세서를 왜곡 시키시겠습니까? C++ 11을 사용한다면'std :: this_thread :: sleep_for (std :: chrono :: milliseconds (n))'와 같은 것을 사용할 수 있습니다. 이것은 CPU를 소비해서는 안됩니다. –
은 순수한 C++입니다. – ElSajko