2012-02-10 201 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

相关问题