我打算写一个适配器类.在这个类中有一个xmlrpc-c服务器(深渊服务器).我想通过创建一个新线程来启动服务器,而线程的函数是成员函数
XMLThreadFun().
当我尝试使用下面的代码时,在适配器的构造函数实现的行上有一个错误:
- /usr/include/boost/bind/bind.hpp:69:37: error: ‘void (Adapter::*)()’ is not a class,struct,or union type
谁能告诉我如何解决这个错误,或者如何实现我的目标?对此,我真的非常感激.
以下是我的代码片段:
- #ifdef _MSC_VER
- #pragma warning( disable : 4503 4355 4786 )
- #else
- #include "config.h"
- #endif
- #include "quickfix/FileStore.h"
- #include "quickfix/SocketInitiator.h"
- #include "quickfix/SessionSettings.h"
- #include "Application.h"
- #include <string>
- #include <iostream>
- #include <fstream>
- #include "quickfix/SessionID.h"
- #include "quickfix/Session.h"
- #include "getopt-repl.h"
- #include <cassert>
- #include <xmlrpc-c/base.hpp>
- #include <xmlrpc-c/registry.hpp>
- #include <xmlrpc-c/server_abyss.hpp>
- #include <boost/thread.hpp>
- #include <boost/date_time.hpp>
- using namespace std;
- class theClient : public xmlrpc_c::method {
- public:
- theClient() {}
- theClient(FIX::SocketInitiator* initiator) {
- set<FIX::SessionID> s(initiator->getSessions());
- set<FIX::SessionID>::iterator myIterator;
- for (myIterator = s.begin(); myIterator != s.end(); myIterator++) {
- string str(myIterator->getSenderCompID());
- clientname = str;
- }
- }
- void execute(xmlrpc_c::paramList const& paramList,xmlrpc_c::value * const retvalP) {
- *retvalP = xmlrpc_c::value_string(clientname);
- }
- private:
- string clientname;
- };
- class Adapter {
- private:
- xmlrpc_c::registry myRegistry;
- xmlrpc_c::methodPtr XMLRPCMethodP;
- xmlrpc_c::serverAbyss webServer;
- boost::thread webServerThread;
- public:
- void initWebServer(string rpcHost,string rpcPort);
- void XMLThreadFun();
- Adapter(string rpcHost,string rpcPort);
- };
- Adapter::Adapter(string rpcHost,string rpcPort) : myRegistry(),XMLRPCMethodP(new theClient),webServer(myRegistry,8181,"/tmp/xmlrpc_log"),webServerThread(boost::bind(&Adapter::XMLThreadFun,this,&webServer))
- {
- initWebServer(rpcHost,rpcPort);
- }
- void Adapter::XMLThreadFun() {
- webServer->run();
- }
- void Adapter::initWebServer(string rpcHost,string rpcPort) {
- webServerThread.join();
- }
解决方法
您将需要使用boost :: bind将成员函数作为线程调用.
就像是
就像是
- class MyClass {
- public:
- void Start();
- void DoStuff( int limit );
- };
- MyClass foo;
- boost::thread thread1( boost::bind( &MyClass::Start,&foo ) );
- boost::thread thread2( boost::bind( &MyClass::DoStuff,&foo,30 ) );
- // threads do stuff here
- thread1.join();
- thread2.join();
具体来说,看起来你会改变
- webServerThread( boost::bind( &Adapter::XMLThreadFun,&webServer)
至
- webServerThread( boost::bind( &Adapter::XMLThreadFun,this )