ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SFML 튜토리얼(시간, 스레드)
    활동 기록 😵‍💫/SFML 테트리스 2023. 1. 23. 02:52

    튜토리얼을 공부하고 프로젝트를 시작해야겠다.

     

    SFML의 시간

    sf::Time 시간값 조작하는 모든 SFML클래스 및 함수 이 클래스 사용

     

    (변환시간)

    sf::Time t1 = sf::microseconds(10000);
    sf::Time t2 = sf::milliseconds(10);
    sf::Time t3 = sf::seconds(0.01f);
    
    세번 모두 동일
    
    sf::Time time = ...;
    
    sf::Int64 usec = time.asMicroseconds();
    sf::Int32 msec = time.asMilliseconds();
    float     sec  = time.asSeconds();

    (시간값으로 재생)

    더하기 빼기 비교등과 같은 산술연산 지원. 시간은 음수일수도 있음
    
    sf::Time t1 = ...;
    sf::Time t2 = t1 * 2;
    sf::Time t3 = t1 + t2;
    sf::Time t4 = -t3;
    
    bool b1 = (t1 == t2);
    bool b2 = (t3 > t4);

    (측정시간)

    sf::Clock   시간측정 위한 간단한 클래스
    1. getElapsedTime 시계가 시작된 이후 경과된 시간을 검색하는 기능
    2. 시계 restart를 다시시작하는 기능 
    
     sf::Clock clock; // starts the clock
    ...
    sf::Time elapsed1 = clock.getElapsedTime();
    std::cout << elapsed1.asSeconds() << std::endl;
    clock.restart();
    ...
    sf::Time elapsed2 = clock.getElapsedTime();
    std::cout << elapsed2.asSeconds() << std::endl;
    게임루프의 각 반복에서 경과된 시간 사용하는 예
    
    sf::Clock clock;
    while (window.isOpen())
    {
        sf::Time elapsed = clock.restart();
        updateGame(elapsed);
        ...
    }

     

    스레드

    #include <Thread.hpp>

    다른 스레드와 병렬로 실행되는 일련의 명령 . 모든 프로그램 적어도 하나의 스레드로 구성

    main() 함수를 실행하는 기본 스레드 (단일) 하나이상 추가 (다중)

    -> 동시에 여러작업 수행하는 방법

    스레드 생성하는 클래스 sf::Thread
    #include <SFML/System.hpp>
    #include <iostream>
    
    void func()
    {
    
        // 이 함수는 thread.launch가 호출되면 시작된다 
    
        for (int i = 0; i < 10; ++i)
            std::cout << "minastory" << std::endl;
    }
    
    int main()
    {
      
        // 스레드와 함수의 시작점 만들기
        sf::Thread thread(&func);
    
        // run it
        thread.launch();
    
        // the main thread continues to run...
    
        for (int i = 0; i < 10; ++i)
            std::cout << "cherrycode" << std::endl;
    
        return 0;
    }

    결과 

    두 함수의 텍스트가 콘솔에 혼합되어 출력 

     

    (인수가 하나인 비멤버 함수)

    void func(int x)
    {
    }
    
    sf::Thread thread(&func, 5);

    (Functor ,함수객체)

    -> 많은 유형의 함수와 호환되어서 가장 강력한 예제

    struct MyFunctor
    {
        void operator()()
        {
        }
    };
    
    sf::Thread thread(MyFunctor());
    // with lambdas
    sf::Thread thread([](){
        std::cout << "I am in thread!" << std::endl;
    });
    // with std::bind
    void func(std::string, int, double)
    {
    }
    
    sf::Thread thread(std::bind(&func, "hello", 24, 0.5));

    클래스 내에서 sf::Thread를 사용하려면 기본생성자가 없다는 것을 잊으면 안된다. 

    생성자의 초기화 목록에서 직접 초기화 해야한다.

    class ClassWithThread
    {
    public:
    
        ClassWithThread()
        : m_thread(&ClassWithThread::f, this)  //직접초기화
        {
        }
    
    private:
    
        void f()
        {
            ...
        }
    
        sf::Thread m_thread;
    };

    스레드 시작

    sf::thread 객체를 만들면, launch() 함수를 실행해야함 

    sf::Thread thread(&func);
    thread.launch();

    스레드 중지

    진입점 함수가 반환되면 스레드 자동 중지된다. 스레드가 다른 스레드에서 완료될 때까지 기다리려면 해당 wait 함수를 

    호출 할 수 있다. 

    sf::Thread thread(&func)
    //start the thread
    thread.launch();
    
    
    //스레드가 끝날때까지 블록 실행
    thread.wait();

    (일시중지)

    현재 스레드만 일시중지 할 수 있음 

    void func() 
    {
      sf::sleep(sf::milliseconds(10));
      
      }

    이 함수로 모든 스레드 잠자기 상태로 만들 수 있음.  일시중지 하는 가장 효율적인 방법이다. 

     

    (공유 데이터 보호  - 뮤텍스)

    #include <SFML/System.hpp>
    #include <iostream>
    
    sf::Mutex mutex;
    
    void func()
    {
        mutex.lock();
    
        for (int i = 0; i < 10; ++i)
            std::cout << "cherrycode" << std::endl;
    
        mutex.unlock();
    }
    
    int main()
    {
        sf::Thread thread(&func);
        thread.launch();
    
        mutex.lock();
    
        for (int i = 0; i < 10; ++i)
            std::cout << "minastory" << std::endl;
    
        mutex.unlock();
    
        return 0;
    }

    결과 

    콘솔에 혼합 되지 않고 출력된다 

     

    스레드 함수를 따로 생성하는 게 아니라는 뜻..? 

    이렇게 하면 호출되는 동시에 즉시 소멸이라고 함 

    그러니까 main 함수에 생성해야..되는것 같다 ? 

Diseñada por Tistory.