2016-07-23 20 views
5

私は現在、ソケットサーバーからいくつかのイメージをダウンロードする必要があるプログラムを開発しており、ダウンロード作業は長時間実行されます。だから、私はそれを行うために新しいstd::threadを作成します。std :: threadを終了するには?

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

ようこそスタックオーバーフロー!私はあなたの問題を推測できる限りあなたの質問を編集しました。ただし、コードと説明の説明を追加して、より多くの人々がその知識を持つ人に見られるようにします。特定の問題を特定するために必要な場合は、特定のエラーメッセージを編集してください。がんばろう! – manetsus

+2

'std :: future 'を使ってみませんか? – Superlokkus

+1

[C++ 0xスレッド中断]可能な複製(http://stackoverflow.com/questions/2790346/c0x-thread-interruption) – kfsone

答えて

3

スレッドをデタッチしないでください。その代わりに、threadへのポインタを保持するデータメンバと、デストラクタのスレッドjoinを持つことができます。

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

この場合、メインスレッドとダウンロードスレッドの間で何らかの同期をとる必要があります。たとえば、「停止」フラグを付けることができます。ダウンロードスレッドは、フラグが設定されている場合は1秒ごとにフラグをチェックし、ダウンロードを終了します。デストラクタでは、最初に 'stop'フラグを設定してからスレッドに参加してください。 –

+0

あなたの助けてくれてありがとう、それは今働いています。もし "downloadImg"機能が静的なlirbraryのインターフェースなら、どうすればいいですか? – tobin

関連する問題