C ++ 프로그램에 시간 지연을 추가하려고하는데, 누군가 내가 시도 할 수있는 것에 대한 제안이나 내가 볼 수있는 정보가 있는지 궁금합니다.
이 시간 지연을 구현하는 방법에 대한 자세한 내용을 알고 싶지만, 시간 지연을 추가하는 방법에 대한 자세한 정보를 얻을 때까지이를 구현하려고 시도해야할지 확신 할 수 없습니다.
답변:
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 나노초 동안 휴면하도록 요청할 수 있지만 구현이 가장 짧은 경우 밀리 초 동안 휴면 상태가 될 수 있습니다.
다음과 같이 간단한 것을 원하십니까?
#include <unistd.h>
sleep(3);//sleeps for 3 second
이 코드 조각을 시도해 볼 수 있습니다.
#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));
}
마이크로 초 정밀도를 원하는 경우 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);
}
`
예, 수면은 아마도 여기서 선택하는 기능 일 것입니다. 함수에 전달 된 시간은 호출 스레드가 비활성화되는 최소 시간입니다. 예를 들어 5 초 동안 sleep을 호출하면 스레드가 최소 5 초 동안 절전 상태가 될 것입니다. OS가 수행하는 작업에 따라 6, 8 또는 50이 될 수 있습니다. (최적의 OS 실행 중에 이것은 5에 매우 가깝습니다.)
sleep 함수의 또 다른 유용한 기능은 0을 전달하는 것입니다. 이것은 스레드에서 컨텍스트 전환을 강제합니다.
추가 정보 :
http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html
고정 된 시간 동안 cpp에서 출력을 지연하려면 Sleep () 함수에 대한 windows.h 헤더 파일 구문을 포함하여 Sleep () 함수를 사용할 수 있습니다. Sleep (time_in_ms)
cout<<"Apple\n";
Sleep(3000);
cout<<"Mango";
산출. 위의 코드는 Apple을 인쇄하고 Mango를 인쇄하기 전에 3 초 동안 기다립니다.
여기에서 가장 좋은 대답은 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;
}
다른 많은 사람들이 수면에 대한 좋은 정보를 제공했습니다. 나는 수면이 가장 적절한 해결책이 거의 없다는 웨지에 동의합니다.
당신이 무언가를 기다리면서 잠을 자고 있다면, 실제로 그 일 / 이벤트를 기다리는 것이 낫습니다. 이에 대한 조건 변수를 살펴보십시오.
이 작업을 수행하려는 OS를 모르지만 스레딩 및 동기화를 위해 Boost Threading 라이브러리 ( Boost Condition Varriable )를 살펴볼 수 있습니다.
예외적으로 짧은 기간을 기다리려는 경우 다른 극단으로 이동하면 몇 가지 해킹 스타일 옵션이 있습니다. 'sleep'이 구현되지 않은 일종의 임베디드 플랫폼에서 작업하는 경우 빈 본문으로 간단한 루프 (for / while 등)를 시도 할 수 있습니다 (컴파일러가이를 최적화하지 않도록주의하십시오). 물론이 경우 대기 시간은 특정 하드웨어에 따라 다릅니다. 정말 짧은 '대기'를 위해 "nop"어셈블리를 시도 할 수 있습니다. 나는 이것이 당신이 추구하는 것임을 매우 의심하지만 왜 기다려야하는지 알지 못하면 더 구체적으로 말하기가 어렵습니다.