2016-09-14 15 views
6

Tôi có một vấn đề với việc sử dụng std :: thread trong mã của tôi:Passing chức năng thành viên lớp để std :: chủ đề

Class Timer 
{ 
... 
public: 
    void Start(bool Asynch = true) 
    { 
     if (IsAlive()) 
     { 
      return; 
     } 
     alive = true; 
     repeat_count = call_number; 
     if (Asynch) 
     { 
      t_thread = std::thread(&ThreadFunc, this); 
     } 
     else 
     { 
      this->ThreadFunc(); 
     } 
    } 
    void Stop() 
    { 
     alive = false; 
     t_thread.join(); 
    } 
... 
} 

tôi nhận được lỗi sau:

error C2276: '&': illegal operation on bound member function expression

t_thread là std tin lớp của :: thread instance, ThreadFunc() là hàm thành viên private của lớp trả về void;

Tôi nghĩ rằng tôi hiểu rằng có 2 cách để gửi hàm thành viên tới std :: thread, nếu hàm tĩnh, tôi sẽ sử dụng t_thread = std :: thread (threadfunc); Nhưng tôi không muốn ThreadFunc là tĩnh, và làm như thế này cho tôi lỗi.

Tôi nghĩ rằng tôi đã giải quyết được vấn đề bằng cách tạo chức năng khác:

std::thread ThreadReturner() 
{ 
    return std::thread([=] { ThreadFunc(); }); 
} 
... 
t_thread = ThreadReturner(); 

Bằng cách này tôi không nhận lỗi, nhưng tôi không hiểu tại sao người đầu tiên không hoạt động.

Mọi trợ giúp đều được đánh giá cao.

Câu hỏi của tôi trông giống như một bản sao, nhưng chỉ có 1 khác biệt, trong câu trả lời của câu hỏi khác, std :: thread được sử dụng bên ngoài khai báo hoặc triển khai lớp, nó nằm trong main(), trong trường hợp xác định phạm vi cảm giác với tôi, nhưng không phải khi std :: thread được gọi bên trong lớp. Đó là sự khác biệt duy nhất mà tôi thấy và lý do tại sao tôi thực hiện chủ đề này, xin lỗi về có thể trùng lặp.

Trả lời

5

Bạn nên xác định phạm vi

&Timer::ThreadFunc 
+0

Cảm ơn bạn! Điều đó hoạt động. – Dragon

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