728x90
목차
- Sleep()
- 문제점
- 해결방법
Sleep()
- 지연시간을 주는 함수이다.
- windows에서는 #include <windows.h>와 함께 사용된다. 하지만 Mac에서는 다르다.
- Sleep( )괄호 안에는 숫자를 넣어 지연시간을 설정하는데, windows에서는 ms(밀리새컨드) 단위이다. (즉, 1초를 지연시키고 싶다면 1000을 넣어주면된다. 하지만 Mac에서는 다르다.)
문제점
- Mac OS와 Windows는 헤더파일과 함수, 사용법에서 차이가 있다.
- 아래 예제(주사위를 3번 던지고 나온 값을 1초마다 각각 출력)를 수행하고싶었다.
- 아래 예제는 현재 sleep이 반영이 안되어있다.
#include <iostream>
#include <time.h> //시간
#include <stdlib.h> //rand,srand
int main(){
int dice = 0;
srand(time(NULL));
printf("주사위의 숫자는 : ");
for(int count = 0; count < 3; count++){
//<<sleep 반영 예정 자리>>
dice = rand()%6+1;
printf("%d ",dice);
}
printf("\n");
}
해결방법
- MacOS 호환 헤더파일 사용
- 버퍼링 문제 해결
1. MacOS호환 헤더파일 사용
- #include<unistd.h> / sleep( )함수 사용
여기서는 windows의 sleep과 다르게 ( )괄호안에 s(1초)를 입력해주면 된다.(windows는 ms단위)
- 문제는 분명 for문이 돌았을때 1초에 한번씩 printf가 되어야하는데, 3초를 전부 기다렸다가 3개숫자가 출력이 되는것이었다.
- 헤더파일이 문제인가 싶어서 다른 헤더파일도 찾아보았다.
#include <iostream>
#include <time.h> //시간
#include <stdlib.h> //rand,srand
#include <unistd.h> // <windows.h> 대체
int main(){
int dice = 0;
srand(time(NULL));
printf("주사위의 숫자는 : ");
for(int count = 0; count < 3; count++){
sleep(1);
dice = rand()%6+1;
printf("%d ",dice);
}
printf("\n");
}
- 다음은 코드에 대한 이해도 없이 단순히 적용만 시킨 예제이다.
- <chrono>,<thread> 추가 및 c++문법사용
- 하지만 역시 3초를 전부 기다려야 출력이 되었다.
#include <iostream>
#include <chrono>
#include <thread>
#include <time.h>
int main() {
srand(time(NULL));
int randomDice;
std::chrono::seconds delay(1);
std::cout << "주사위의 숫자는 : ";
for(int i=0; i<3;i++){
std::this_thread::sleep_for(delay);
randomDice = rand()%5+1;
printf("%d ",randomDice);
}
return 0;
}
2. 버퍼링 문제 해결
- 어떻게 찾다보니, 버퍼링이라는 개념이 있다는것을 알게되었다.
- Mac OS에서는 기본적으로 line Buffering 이라는 개념이 표준출력에 이용되는데, 이 점이 문제였다.
* line buffering이란 : 개행문자('\n')가 나타나거나 버퍼가 가득찰때까지 기다렸다가 한번에 출력하는것을 의미한다.
setbuf(stdout, NULL); // 버퍼링 비활성화
- 버퍼링을 비활성화 해주는 문장을 입력해주었더니 해결되었다.
#include <iostream>
#include <time.h> //시간
#include <stdlib.h> //rand,srand
#include <unistd.h> // <windows.h> 대체
int main(){
setbuf(stdout, NULL); // 버퍼링 비활성화
int dice = 0;
srand(time(NULL));
printf("주사위의 숫자는 : ");
for(int count = 0; count < 3; count++){
sleep(1);
dice = rand()%6+1;
printf("%d ",dice);
}
printf("\n");
}
728x90
'프로그래밍 > C,C++' 카테고리의 다른 글
[C/C++]while, for, switch, rand 알아보기 (0) | 2023.06.04 |
---|---|
C 예제 2번째 (홀짝게임) (0) | 2023.06.04 |
[오류_C/C++] MAC에서 system("cls")를 사용하고싶다면? (0) | 2023.06.02 |
예제) 크리티컬 확률과 몬스터 사냥하기 feat 줄 정렬 (0) | 2023.06.02 |
[오류_C/C++] scanf(%d,&a)에 문자를 입력할 경우 컴퓨터는 어떻게 받아들이는가? (0) | 2023.06.02 |