2011-07-15 14 views
6

Bir bağdaştırıcı sınıfı yazacağım. Bu sınıfta bir xmlrpc-c sunucusu (abyss server) var. Yeni bir iş parçacığı oluşturarak sunucuyu başlatmak istiyorum ve iş parçacığının işlevi XMLThreadFun() üye işlevidir. Sınıf üyesi işlevi, destek işleviyle iş parçacığı işlevi olarak nasıl yapılır

Ben kodu kullanmayı deneyin

aşağıda olduğu adaptörünün yapıcı uygulamasının hattında bir hata:

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

herkes nasıl nasıl benim hedefe ulaşmak için bu hatayı veya çözmek bana söyleyebilir misiniz? Gerçekten onu takdir ederim. Bir iş parçacığı olarak üye işlevi çağırmak için boost :: bağlama kullanmanız gerekecektir

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

cevap

8

:

Aşağıda benim kod parçacığı olduğunu. Eğer

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

olduğunu bağlamak ::

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

için

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

Aslında boost :: bind'i kullandım. Adaptör :: Adaptör (string rpcHost, dize rpcPort): Yapıcı hattının sonuna bakın myRegistry(), XMLRPCMethodP (yeni URI'si Sorgu), web sunucusu (myRegistry, 8181, "/ tmp/xmlrpc_log"), webServerThread (artırmak :: bağlama (& Adapter :: XMLThreadFun, bu & webServer)) –

+0

Ah - argümanlarınız uyuşmuyor. XMLThreadFun hiçbir argüman almaz, ancak aramanızdaki webServer'a bir işaretçi belirtiyorsunuz. – Josh

5

boost kullanmak gerek yok değiştirecek gibi Özellikle burada

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

gibi şey, görünüşe eşittir:

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

Bu, sanırım, Josh'un cevabının bir yorumu (veya eki) midir? – jogojapan

İlgili konular