2016-07-23 22 views
5

Tôi hiện đang phát triển một chương trình cần tải xuống một số hình ảnh từ máy chủ socket và công việc tải xuống sẽ thực thi trong một thời gian dài. Vì vậy, tôi tạo một std::thread mới để làm điều đó.Làm thế nào để chấm dứt một std :: thread?

Sau khi tải xuống, std::thread sẽ gọi chức năng thành viên của Lớp hiện tại, nhưng Lớp này có thể đã được phát hành. Vì vậy, tôi có một ngoại lệ.

Cách giải quyết vấn đề này?

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

Chào mừng bạn đến với Stack Overflow! Tôi đã chỉnh sửa câu hỏi của bạn theo như tôi có thể đoán được vấn đề của bạn. Tuy nhiên, hãy thêm giải thích về mã và mô tả để nhiều người có kiến ​​thức về chủ đề sẽ thấy nó. Vui lòng chỉnh sửa trong thông báo lỗi cụ thể mà bạn đang gặp phải trong trường hợp cần thiết để xác định vấn đề cụ thể. Chúc may mắn! – manetsus

+2

Tại sao bạn không sử dụng 'std :: future '? – Superlokkus

+1

Có thể trùng lặp của [C++ 0x thread interruption] (http://stackoverflow.com/questions/2790346/c0x-thread-interruption) – kfsone

Trả lời

3

Không tháo chỉ. Thay vào đó, bạn có thể có một thành viên dữ liệu giữ một con trỏ đến threadjoin luồng trong trình phá hủy.

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

CẬP NHẬT

Cũng như @milleniumbug chỉ ra, bạn không cần phải phân bổ động cho các đối tượng thread, vì nó là di chuyển. Vì vậy, các giải pháp khác là như sau.

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

Cảm ơn, tôi đã thử phương pháp này, nhưng đó là một dịp đặc biệt, "YourClass" là cảnh trò chơi, người dùng có thể bật cảnh này bất cứ lúc nào, nếu bạn làm vậy, nó sẽ cản trở một thời gian dài khi người dùng bật cảnh này – tobin

+0

Trong trường hợp này, bạn phải thực hiện đồng bộ hóa giữa chủ đề chính và chuỗi tải xuống của bạn. Ví dụ: bạn có thể có cờ 'dừng'. Chuỗi tải xuống kiểm tra cờ cứ sau 1 giây, nếu cờ đã được đặt, sau đó thoát khỏi tải xuống. Trong trình hủy, đặt cờ 'dừng' trước, sau đó tham gia chuỗi. –

+0

cảm ơn sự giúp đỡ của bạn, Nó hoạt động ngay bây giờ.Nếu chức năng "downloadImg" là một giao diện của một lirbrary tĩnh, tôi nên làm gì? – tobin

Các vấn đề liên quan