2013-11-02 104 views
1

我使用線程爲了在OpenGL應用程序中爲用戶提供一個shell。std ::線程和輸入與std :: cin在opengl應用程序

我的問題是,我不能取消線程在我的主循環結束,因爲std ::線程不提供取消方法,我的線程被阻止與std::cin >> var調用,所以我不能使用布爾值來存儲線程應該停止的事實。

我想知道在線程(std :: thread)或其他解決方案中使用std :: cin是否有很好的方法。

+0

是你的線程分離或加入 – aaronman

+0

無。如果我調用thread.join(),應用程序將等待線程的結束,但線程被std :: cin調用阻塞。我可能不明白什麼是分離線程(與fork()分離當前進程?) –

+0

聽起來像它的加入,在C++ 11中創建一個線程後,你要麼加入或分離它 – aaronman

回答

1

你可能想要的是一箇中斷線程,C++不會給你一個,但c++ concurrency in action有一個簡單的實現。這可能是你需要的。如果boost還有一個,因爲這本書是由線程庫的維護者編寫的,所以不會感到驚訝。

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:它顯示我需要一個實例在我的線程中,它會發送異常。 –