1

大量のオーバーヘッドがあるリサイクル クライアントを作成しています: a TSocket、 a TBufferedTransport、および a TBinaryProtocol。通常はこのように作成されます

サンプル Thrift クライアント

int main(int argc, char **argv) {
    shared_ptr<TTransport> mysocket(new TSocket("localhost", 9090));
    shared_ptr<TTransport> mytransport(new TBufferedTransport(mysocket));
    shared_ptr<TProtocol> myprotocol(new TBinaryProtocol(mytransport));
    TestServiceClient client(myprotocol);

    try {
        mytransport->open();
        client.testmethod();  //and you can call server methods like so
        mytransport->close();
    }catch (TException &tx) {
        printf("ERROR: %s\n", tx.what());
    }
}

ただし、私のクライアントには、静的ライブラリの形式でそれが必要です。したがって、 main メソッドはなく、open と closeのメソッドinit()とメソッドを作成しました。つまり、 、 、 、およびすべてのグローバル変数を作成する必要がありましたが、メソッド内で初期化することを意味する "localhost" 以外の ip に設定する必要もあります。何か案は?exit()mytransportmysocketmytransportmyprotocolclientmysocketmysocket

PS。また、静的ライブラリを開いたり閉じたりするときに自動的にinit()呼び出す方法を知っている人はいますか? exit()[解決済み]

編集:正しいIPを知るまで初期化できないことを忘れていた mysocketので、とにかくmysocketをグローバル変数として宣言できないと思います

4

2 に答える 2

1

結局自分で解決しました。Aggieboyが提案したような静的ローカル変数の使用は完全に有効に思えますが、これは少し簡単だと思います:

ベアボーン バージョン

shared_ptr<TTransport> mysocket(createTSocket());

TSocket* createTSocket() {
    //init stuff goes here, for example
    string ip = "localhost"
    int port = 9090

    return new TSocket(ip,port)
}

完全なコード (まあ、そのほとんど)

class ThriftProxy {
public:
    ThriftProxy() :
        trans(createTSocket()),
        proto(new TBinaryProtocol(trans)),
        client(proto)
    {
        trans->open();
    }

    TSocket* createTSocket() {
        //default: ip = "localhost", port = 9090
        string ip = "localhost";
        int port = 9090;

                    //get ip and port from a text file

        return new TSocket(ip, port);
    }

    ~ThriftProxy()
    {
        trans->close();
    }

private:
    boost::shared_ptr<TSocket> trans;
    boost::shared_ptr<TProtocol> proto;
public:
    XtkServiceClient client;
};
于 2013-07-17T22:04:04.653 に答える