2012-02-10 109 views
1

即時做一個C++類在內部,我想創建一個線程來執行類的功能,我該怎麼做?我給你看一些代碼。如何啓動一個運行類函數的boost線程?

成員函數我想在一個線程中運行:

void SocketServer::runServer(){ 
    bool connected; 
    tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), puerto)); 
    std::string data; 

    while(seguirFuncionando()){ 
     miSocket = new tcp::socket(io_service); 
     std::cout << "Waiting for connection...\n"; 
     a.accept(*miSocket); 
     std::cout << "Connected\n"; 
     connected = true; 
     try{ 
      while (connected){ 
       data = readStr(); 
       if (data.compare("")==0){ 
        std::cout << "End of connection.\n"; 
       } 
       else{ 
        std::cout << data << "\n"; 
       } 
      } 
     } 
     catch (std::exception& e){ 
     std::cerr << "Exception in thread: " << e.what() << "\n"; 
     } 
    } 
} 

什麼我嘗試做:

void SocketServer::runThreadServer(){ 
    asio::thread t(runServer); 
} 

但它不編譯。錯誤:

沒有匹配函數調用'asio :: thread :: thread() 注意:候選是:asio :: thread :: thread(Function)[with Function = void(SocketServer :: *)( )]

我該怎麼做?

Thanx。

+1

你可能想嘗試用[boost.bind(http://www.boost.org/doc/libs/1_48_0/libs/bind/bind.html) – 2012-02-10 17:27:43

+0

@JoachimPileborg你能舉個例子嗎?即時通訊新的提振,而我有點失落:P – Alex 2012-02-10 17:29:25

回答

4

像Joachim Pileborg說的,標準的做法是使用boost::bindboost::bind專門從C++對象及其成員函數構造一個名爲boost::function(可能在boost::thread的c'tor中傳遞)的構造。

事情是這樣的:

boost::thread t(boost::bind(&SocketServer::runServer, this)); 
+0

Thanx,這工作得很好:) Thanx valdo和Joachim。另一件事,我可以在哪裏學習如何提升Threads和Asio?我開發了一個客戶端 - 服務器應用程序,我需要處理得很好,但官方文檔不是很廣泛。我在哪裏可以得到很好的例子? Thanx – Alex 2012-02-10 17:41:30

+0

準確地說,'boost :: bind'不會創建'boost :: function'對象,它會創建* unknown *(無文檔,可以隨時更改)類型的對象,該類型可以分配給'boost ::功能「的適當簽名。 – 2012-02-10 17:45:46

相關問題