2011-07-15 10 views
6

Mam zamiar napisać klasę adaptera. W tej klasie znajduje się serwer xmlrpc-c (serwer otchłani). Chcę uruchomić serwer, tworząc nowy wątek, a funkcja wątku jest funkcją składową XMLThreadFun().Jak sprawić, by element członkowski klasy działał jak funkcja wątku za pomocą doładowania

Kiedy próbuję użyć poniższy kod jest błąd w wierszu realizacji konstruktora adaptera:

/usr/include/boost/bind/bind.hpp:69:37: error: ‘void (Adapter::*)()’ is not a class, struct, or union type 

może ktoś mi powiedzieć jak rozwiązać ten problem, czyli jak osiągnąć mój cel? Bardzo to doceniam.

Poniżej jest mój urywek kodu:

#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(); 
} 

Odpowiedz

8

Trzeba będzie użyć boost :: wiążą się wywołać funkcję członka, jak nić. Coś

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(); 

Konkretnie tutaj, wygląda na to, byś zmienił

webServerThread(boost::bind(&Adapter::XMLThreadFun, this, &webServer) 

do

webServerThread(boost::bind(&Adapter::XMLThreadFun, this) 
+0

Właściwie użyłem boost :: bind. Zobacz koniec linii konstruktora: Adapter :: Adapter (string rpcHost, string rpcPort): myRegistry(), XMLRPCMethodP (nowy theClient), webServer (myRegistry, 8181, "/ tmp/xmlrpc_log"), webServerThread (boost :: bind (& Adapter :: XMLThreadFun, this i webServer)) –

+0

Ah - Twoje argumenty nie pasują do siebie. XMLThreadFun nie przyjmuje żadnych argumentów, ale podajesz wskaźnik do serwera WWW w swoim wywołaniu. – Josh

5

Nie trzeba używać boost :: wiążą

boost::thread thread2(boost::bind(&MyClass::DoStuff, &foo, 30)); 

jest równoważny:

boost::thread thread2(&MyClass::DoStuff, &foo, 30 ); 
+2

To, jak przypuszczam, jest komentarzem (lub uzupełnieniem) odpowiedzi Josha? – jogojapan

Powiązane problemy