2016-07-23 22 views
5

Ich entwickle gerade ein Programm, das einige Bilder vom Socket-Server herunterladen muss, und die Download-Arbeit wird lange dauern. Also, ich erstelle eine neue std::thread, um das zu tun.Wie man einen Std :: Thread beendet?

Sobald es heruntergeladen wird, wird die std::thread eine Mitgliedsfunktion der aktuellen Klasse aufrufen, aber diese Klasse wurde wahrscheinlich freigegeben. Also, ich habe eine Ausnahme.

Wie löst man dieses Problem?

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

Willkommen bei Stack Overflow! Ich habe deine Frage soweit bearbeitet, wie ich dein Problem erraten konnte. Fügen Sie jedoch eine Erläuterung des Codes und der Beschreibung hinzu, damit mehr Personen mit Wissen über das Thema sie sehen können. Bitte editieren Sie in der spezifischen Fehlermeldung, die Sie antreffen, falls es notwendig ist, das spezifische Problem zu identifizieren. Viel Glück! – manetsus

+2

Warum verwenden Sie kein 'std :: future '? – Superlokkus

+1

Mögliches Duplikat von [C++ 0x Thread-Unterbrechung] (http://stackoverflow.com/questions/2790346/c0x-thread-interruption) – kfsone

Antwort

3

Den Faden nicht lösen. Stattdessen können Sie ein Datenelement haben, das einen Zeiger auf thread und join den Thread in Destruktor enthält.

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

UPDATE

Wie @milleniumbug darauf hingewiesen, die Sie nicht die dynamische Zuordnung für das thread Objekt benötigen, da sie beweglich ist. Also ist die andere Lösung wie folgt.

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

Danke, ich habe diese Methode versucht, aber es ist ein besonderer Anlass, die "YourClass" ist eine Spielszene, Benutzer können diese Szene jederzeit knallen, wenn Sie es tun, wird es eine lange Zeit behindern, wenn Benutzer diese Szene Pop – tobin

+0

In In diesem Fall müssen Sie eine Synchronisierung zwischen dem Hauptthread und Ihrem Download-Thread durchführen. Zum Beispiel können Sie eine "Stop" -Flagge haben. Der Download-Thread überprüft das Flag alle 1 Sekunde, wenn das Flag gesetzt wurde, und beendet den Download. Setzen Sie im Destruktor zuerst das Flag "Stop" und dann den Thread. –

+0

danke für Ihre Hilfe, es funktioniert jetzt.Wenn die "DownloadImg" -Funktion eine Schnittstelle einer statischen Bibliothek ist, was soll ich tun? – tobin