2016-07-23 73 views
5

我目前正在開發一個程序,需要從套接字服務器下載一些圖片,並且下載工作將會執行很長時間。所以,我創建了一個新的std::thread來做到這一點。如何終止一個std ::線程?

下載後,std::thread會調用當前類的成員函數,但該類很可能已經發布。所以,我有一個例外。

如何解決這個問題?

void xxx::fun1() 
{ 
    ... 
} 
void xxx::downloadImg() 
{ 
...a long time 
    if(downloadComplete) 
    { 
    this->fun1(); 
    } 
} 
void xxx::mainProcees() 
{ 
    std::thread* th = new thread(mem_fn(&xxx::downloadImg),this); 
    th->detach(); 
    //if I use th->join(),the UI will be obstructed 
} 
+0

歡迎來到Stack Overflow!我儘可能地猜測你的問題,然後編輯你的問題。但是,添加對代碼和描述的解釋,以便更多具有該主題知識的人員可以看到它。如果需要識別特定問題,請編輯您遇到的特定錯誤消息。祝你好運! – manetsus

+2

爲什麼不使用'std :: future '? – Superlokkus

+1

[C++ 0x線程中斷]的可能重複(http://stackoverflow.com/questions/2790346/c0x-thread-interruption) – kfsone

回答

3

請勿分離線。相反,您可以擁有一個數據成員,該成員持有指向threadjoin析構函數的指針。

class YourClass { 
public: 
    ~YourClass() { 
     if (_thread != nullptr) { 
      _thread->join(); 
      delete _thread; 
     } 
    } 
    void mainProcees() { 
     _thread = new thread(&YourClass::downloadImg,this); 
    } 
private: 
    thread *_thread = nullptr; 
}; 

UPDATE

正如@milleniumbug指出的那樣,你並不需要動態分配的thread對象,因爲它是可移動的。所以另一個解決方案如下。

class YourClass { 
public: 
    ~YourClass() { 
     if (_thread.joinable()) 
      _thread.join(); 
    } 
    void mainProcess() { 
     _thread = std::thread(&YourClass::downloadImg, this); 
    } 
private: 
    std::thread _thread; 
}; 
+0

謝謝,我已經嘗試過這種方法,但是這是一個特殊的場合,「YourClass」是一個遊戲場景,用戶可以隨時彈出這個場景,如果你這樣做,會阻礙很長一段時間用戶彈出這個場景 – tobin

+0

In在這種情況下,你必須在主線程和你的下載線程之間做一些同步。例如,您可以擁有「停止」標誌。下載線程每隔1秒檢查一次標誌,如果標誌已設置,則退出下載。在析構函數中,首先設置「停止」標誌,然後加入該線程。 –

+0

感謝您的幫助,它現在可以工作。如果「downloadImg」函數是一個靜態lirbrary的接口,我該怎麼做? – tobin