【问题标题】:How can I start a boost Thread running a class function?如何启动运行类函数的 boost 线程?
【发布时间】:2012-03-03 04:07:39
【问题描述】:

我正在做一个 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);
}

但它不能编译。错误:

没有匹配的函数调用'asio::thread::thread() 注意:候选人是:asio::thread::thread(Function) [with Function = void (SocketServer::*)()]

我该怎么做?

谢谢。

【问题讨论】:

  • 你可能想试试boost.bind
  • @JoachimPileborg 你能给我举个例子吗?我是新手,我有点失落:P

标签: c++ boost boost-asio boost-thread


【解决方案1】:

就像 Joachim Pileborg 所说,执行此操作的标准方法是使用 boost::bindboost::bind 专门从 C++ 对象及其成员函数中创建了一个名为 boost::function 的构造(可以在 boost::thread 的 c'tor 中传递)。

类似这样的:

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

【讨论】:

  • Thanx,效果很好 :) Thanx valdo 和 Joachim。另一件事,我在哪里可以很好地了解 boost Threads 和 Asio?我正在开发一个客户端-服务器应用程序,我需要很好地处理这个问题,但官方文档不是很广泛。我在哪里可以找到好的例子?谢谢
  • 准确地说,boost::bind 不会创建 boost::function 对象,它会创建可以分配给的 unknown(未记录,可以随时更改)类型的对象适当签名的boost::function
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多