2013-11-02 4 views
1

OpenGL 응용 프로그램에서 사용자에게 쉘을 제공하기 위해 스레드를 사용합니다.std :: thread 및 opengl 응용 프로그램에서 std :: cin을 사용하여 입력

제 문제는 std :: thread가 취소 메서드를 제공하지 않고 내 스레드가 std::cin >> var 호출로 막혀서 mainloop의 끝에서 스레드를 취소 할 수 없다는 것입니다. 부울을 사용하여 스레드가 중지되어야한다는 사실을 저장하십시오.

스레드 (std :: thread) 또는 대체 솔루션에서 std :: cin을 사용하는 좋은 방법이 있는지 알고 싶습니다.

+0

은 분리되었거나 결합 된 스레드입니다. – aaronman

+0

없음. thread.join()을 호출하면 응용 프로그램은 스레드의 끝을 기다리지 만 스레드는 std :: cin 호출로 차단됩니다. 스레드 분리 (fork()와 같은 현재 프로세스 분리) 이해할 수 없습니다. –

+0

C++ 11에서 스레드를 만든 후에는 조인 또는 분리를 호출 한 후 소리가납니다. – aaronman

답변

1

인터럽트 스레드가 있으면 좋겠지 만 C++은 사용자에게 알려주지 않지만 c++ concurrency in action에는 간단한 구현이 하나 있습니다. 그게 당신이 필요로하는 것일 수도 있습니다. 책이 쓰레드 라이브러리의 관리자에 의해 쓰여졌 기 때문에 부스트에도 문제가 생기면 놀라지 않을 것입니다.

class interrupt_flag 
    { 
    public: 
    void set(); 
     bool is_set() const; 
    }; 
    thread_local interrupt_flag this_thread_interrupt_flag; 
    class interruptible_thread 
    { 
     std::thread internal_thread; 
     interrupt_flag* flag; 
    public: 
     template<typename FunctionType> 
     interruptible_thread(FunctionType f) 
     { 
      std::promise<interrupt_flag*> p; 
      internal_thread=std::thread([f,&p]{ 
        p.set_value(&this_thread_interrupt_flag); 
        f(); 
       }); 
     flag=p.get_future().get(); 
    } 
    void interrupt() 
    { 
     if(flag) { 
      flag->set(); 
     } 
    } 
}; 

이제 메인에서 스레드를 쉽게 취소 할 수 있습니다. 나는이 책에 대한 링크를 달았지만 그 책의 모든 코드는 또한 무료로 온라인 상태이다. 책에 포함 된 source code에 대한 링크입니다. 도서가 없으면 탐색하기 어려울 수 있지만 읽는 것이 좋습니다.

+0

이 코드는 어떻게 도움이됩니까? –

+0

감사합니다. 그것은 내가 필요한 것입니다. –

+0

@KerrekSB : 예외를 보낼 스레드에 인스턴스가 필요하다는 것을 보여줍니다. –

관련 문제