2015-04-12 91 views
1

給定對象x,我想啓動一個新線程來調用x.a()甚至x.a(1,2,3)。我可以使用boost::thread爲非成員函數執行此操作;但我如何爲會員功能做到這一點?我如何通過this指針?一般來說,有很多STL和Boost代碼和模板將代碼作爲參數,但是,由於這不是真正在C++中定義的(函數不是一級vals,本地lambda支持)我很困惑他們是如何定義的。我可以做試驗和錯誤,但我想要更清潔的人,更可靠。C++ Boost.Thread:傳遞對象的方法

更新:我的問題主要涉及傳遞一個方法;當我嘗試做什麼將是明顯的語法(ClassName::method_name, instance)我得到invalid use of non-static member functionerror: no matching function to call。如果你能夠在非靜態方法中顯示使用Boost.thread的正確語法,這將有所幫助。

UPDATE 2:我發現我爲什麼要爲此而苦苦掙扎。給出的答案,比如@OrDinari,適用於boost::thread。但是,當我嘗試使用thread_group,就是thread_group::create_thread,我得到這個錯誤:

error: no matching function for call to ‘boost::thread_group::create_thread(void (C::*)(), C*)’ 

所以:

  1. 爲什麼它的根單絲工作,但不是線程組?
  2. 如何在組中創建線程來運行成員函數?
+2

C++確實具有原生lambda支持。 – Puppy

+0

如果你是一個原始的野蠻人,你也可以使用boost :: bind。 – Puppy

+0

這已經在StackOverflow –

回答

2

下面是一個例子:

 boost::thread _commandControl(&Client::commandControl, &client); 

此創建一個新的線程,使用客戶端對象方法commandControl,從指定的客戶端Client實例。

這裏有點一塊較大的代碼,可能會更容易理解:

Client client(host, port); 
std::cout << "Pick interface (1) Terminal (2) Menu:\n"; 
char interfaceMode; 
std::cin >> interfaceMode; 
while (!client.setMode(interfaceMode)) { 
    std::cout << "\nInvalid choice! try again (1) For Terminal (2)For Menu:"; 
    std::cin >> interfaceMode; 
} 
try { 
    std::cin.ignore(); 
    if (client.connect()) { 
     try { 

      boost::thread _commandControl(&Client::commandControl, &client); 
      boost::thread _checkQueue(&Client::checkQueue, &client); 
      _checkQueue.join(); 
      if (client.checkAlive() == false)throw ConnectionDCexception(); 
      _commandControl.join(); 
      client.close(); 
     } 
     catch (std::exception &e) { 
      std::cout << "\n" << e.what(); 
     } 
    } 
    else { 
     std::cout << "\nFailed to initiate connecting, exiting..."; 
    } 
} 

你正在尋找的主要事情是:

Client client(host, port); 

boost::thread _commandControl(&Client::commandControl, &client); 
boost::thread _checkQueue(&Client::checkQueue, &client); 

各自是不同的線程,從類Client的同一個實例(客戶端)。

+0

謝謝 - 請參閱更新,這對thread_group失敗。你可以看一下嗎? – SRobertJames

0

如果使用C++ 11,你可以使用lambda表達式:

#include <iostream> 
#include <thread> 

class Foo 
{ 
public: 
    void foo() 
    { 
     std::cout << "Foo thread: " << std::this_thread::get_id() << std::endl; 
    } 
}; 

int main() { 
    std::cout << "Main thred: " << std::this_thread::get_id() << std::endl; 

    Foo foo; 
    std::thread t1([&foo]() {foo.foo();}); 
    t1.join(); 

    return 0; 
} 

您可以替換的std ::線程的boost ::線程。