Cómo hacer que la función miembro de clase como el hilo de la función de impulsar el uso de

Voy a escribir un adaptador de clase. En esta clase hay un xmlrpc-c servidor (abismo de servidor). Quiero empezar el servidor mediante la creación de un nuevo hilo, y el hilo de la función es la función de miembro de XMLThreadFun().

Cuando trato de usar el código de abajo hay un error en la línea de que el adaptador del constructor de la aplicación:

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

¿Alguien puede decirme como solucionar este error, o cómo lograr mi objetivo? Realmente lo aprecio.

A continuación es mi fragmento de código:

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

OriginalEl autor Peiti Li | 2011-07-15

2 Kommentare

  1. 8

    Usted tendrá que usar el boost::bind para llamar a una función miembro como un hilo.
    Algo así como

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

    Específicamente aquí, parece que iba a cambiar

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

    a

    webServerThread( boost::bind( &Adapter::XMLThreadFun, this )
    De hecho, he utilizado boost::bind. Ver el fin del constructor de la línea: Adaptador:Adaptador(cadena rpcHost, cadena de rpcPort) : myRegistry(), XMLRPCMethodP(nueva theClient), web(myRegistry, 8181, «/tmp/xmlrpc_log»), webServerThread(boost::bind(&Adaptador::XMLThreadFun, este, &webServer))
    Ah – tus argumentos no coinciden. XMLThreadFun no tiene argumentos, pero se especifica un puntero a la web en su llamada.

    OriginalEl autor Josh

  2. 5

    No hay necesidad de usar el boost::bind

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

    es equivalente a:

    boost::thread thread2( &MyClass::DoStuff, &foo, 30  );
    Esto, supongo, es un comentario de (o complemento) de Josh respuesta?

    OriginalEl autor dielor

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea