프로그래밍/C,C++

[오류_C/C++] Mac에서 sleep함수 사용하는 방법 feat 버퍼링

gameObject 2023. 6. 4. 18:56
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");
}

 

해결방법

  1. MacOS 호환 헤더파일 사용
  2. 버퍼링 문제 해결

 

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