2012-02-10 11 views
1

私はC++クラスをやっていますが、内部的にはクラスの関数を実行するスレッドを作成したいのですが、どうすればいいですか?私はあなたにいくつかのコードを示します。クラス機能を実行するブーストスレッドを開始するにはどうすればよいですか?

私はスレッドで実行するメンバ関数:

やろうとして何イム
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); 
} 

しかし、それはコンパイルdoesntの。エラー:

'asio :: thread :: thread()の呼び出しで一致する関数がありません 注:候補は次のとおりです。asio :: thread :: thread(Function)[Function = void(SocketServer :: *) )]

どうすればよいですか?

Thanx。

+1

あなたは[boost.bind](http://www.boost.org/doc/libs/1_48_0/libs/bind/bind.html)にしようとする場合があります –

+0

@JoachimPileborg私に例を教えてください。私はブーストで新しい、私は少し失われた:P – Alex

答えて

4

Joachim Pileborgと同様に、これを行う標準的な方法はboost::bindを使用することです。 boost::bindは、具体的には、boost::functionという名前のコンストラクト(これは、boost::threadのc'torで渡すことができます)をC++オブジェクトとそのメンバー関数から作成します。

このような何か:

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

サンクス、それはうまくいきました:)サント・ヴァルトとヨアキム。もう1つのことは、どこでスレッドとAsioを強化することができますか?私はクライアントサーバーアプリケーションを開発しています。私はこれを非常にうまく処理する必要がありますが、公式の文書はそれほど広範ではありません。良い例はどこで手に入りますか? Thumbx – Alex

+0

正確に言えば、 'boost :: bind'は' boost :: function'オブジェクトを作成せず、 '未知の*(文書化されていない、いつでも変更できる)タイプのオブジェクトを作成します。適切な署名の「関数」を生成する。 –

関連する問題