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();
}
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)) –
Ah - argümanlarınız uyuşmuyor. XMLThreadFun hiçbir argüman almaz, ancak aramanızdaki webServer'a bir işaretçi belirtiyorsunuz. – Josh