2016-07-23 28 views
5

Şu anda soket sunucusundan bazı görüntüleri indirmek için gereken bir program geliştiriyorum ve indirme işi uzun bir süre yürütecek. Bu yüzden bunu yapmak için yeni bir std::thread oluşturun.std :: thread nasıl sonlandırılır?

Bir kez indirildikten sonra, std::thread geçerli Sınıfın bir üyesi işlevini çağıracak, ancak bu Sınıfın büyük olasılıkla piyasaya sürülme olasılığı yüksektir. Yani bir istisna aldım.

Bu sorun nasıl çözülür?

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

Yığın Taşmasına Hoş Geldiniz! Sorunu, senin problemini tahmin edebildiğim kadar düzenledim. Bununla birlikte, kodun ve açıklamanın açıklamalarını ekleyin, böylece konu hakkında daha fazla kişi bunu görecektir. Lütfen belirli bir sorunu tanımlamak için gerekli olan karşılaştığınız belirli bir hata mesajını düzenleyin. İyi şanslar! – manetsus

+2

Neden bir "std :: future " kullanıyorsunuz? – Superlokkus

+1

[C++ 0x iş parçacığı kesintisi] olası kopyası (http://stackoverflow.com/questions/2790346/c0x-thread-interruption) – kfsone

cevap

3

İpliği ayırmayın. Bunun yerine, thread ve join işaretçisini yoklayıcıdaki iş parçacığına sahip bir veri üyeniz olabilir.

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

GÜNCELLEME

@milleniumbug işaret gibi bu hareketli olduğundan, sen thread nesne için dinamik ayırma gerekmez. Yani diğer çözüm şu şekildedir.

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

Teşekkürler, Bu yöntemi denedim, ama bu özel bir durum, "YourClass" bir oyun sahnesi, kullanıcılar bu sahneyi her zaman pop olabilir, eğer kullanıcılar, bu sahneyi pop bıraktığında uzun bir süre engelleyecektir – tobin

+0

In Bu durumda, ana iş parçacığı ile karşıdan yükleme iş parçacığı arasında bazı eşitleme yapmanız gerekir. Örneğin, bir 'stop' bayrağına sahip olabilirsiniz. İndirme iş parçacığı bayrağı her 1 saniyede bir kontrol eder, bayrak ayarlanmışsa, indirme işleminden çıkın. Yıkıcıda, önce 'dur' bayrağını ayarlayın, ardından iş parçacığına katılın. –

+0

Yardımlarınız için teşekkürler, Şimdi çalışıyor. "DownloadImg" işlevi, statik bir programın bir arabirimi ise, ne yapmalıyım? – tobin

İlgili konular