рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░ред рдЖрдЬ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдк C ++ рдФрд░ Qt рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ gRPC рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рдХреИрд╕реЗ рд▓рд┐рдВрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦ рдЬреАрдЖрд░рдкреАрд╕реА рдореЗрдВ рд╕рднреА рдЪрд╛рд░ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдореЛрдб рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХреНрдпреВрдЖрд░ рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреАрдЖрд░рдкреАрд╕реА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрд▓реЗрдЦ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ Qt рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ gRPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдлрд┐рд░ рднреА, рдЬреАрдЖрд░рдкреАрд╕реА рдХреЗ рдЪрд╛рд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдореЛрдб рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреНрдпреВрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реА ++ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЙрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреВрдЯреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдореИрдВ рд╣рд░ рдХрд┐рд╕реА рд╕реЗ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВред
рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕
рд▓рдЧрднрдЧ рдЫрд╣ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ, рджреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдиреЗ рдореБрдЭ рдкрд░ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛, рдЬреАрдЖрд░рдкреАрд╕реА рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рднрд╛рдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рджреЛрдиреЛрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЧрд┐рд░ рдЧрдИрдВред рдЗрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╣реА рдЫреЛрдбрд╝ рдЪреБрдХреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рдереА рдХрд┐ рдореИрдВрдиреЗ рдЬреАрдЖрд░рдкреАрд╕реА рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рднрд╛рдЧ рд▓рд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд╡реЛ рдХрд░реАрдм рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдХреА рдмрд╛рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореБрдЭреЗ рдЦрд░реЛрдВрдЪ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рд╛ред
рдЬреАрдЖрд░рдкреАрд╕реА рд╕рд░реНрд╡рд░ рдХреЛрдб рдЗрд╕ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдпрд╣ .proto рдлрд╝рд╛рдЗрд▓ рджреНрд╡рд╛рд░рд╛ рдЖрдЧреЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреЛрдб рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рд░реНрд╡рд░ рдореЗрдВ рдПрдХ рдмрдбрд╝реА рдЦрд╛рдореА рдереА: рдХреЗрд╡рд▓ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝ рд╕рдХрддрд╛ рдерд╛ред
GRPC рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдмрд╣реБрдд рднрдпрд╛рдирдХ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред
рдореБрдЭреЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдмрд╛рдж рд╣реА рдЧреНрд░рд╛рд╣рдХ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛрдб gRPC рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ред рдФрд░ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЕрдЧрд░ рдореИрдВрдиреЗ рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓рд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рд╕рд░реНрд╡рд░ рдФрд░ рдЬреАрдЖрд░рдкреАрд╕реА рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рддрдм рдерд╛ рдЬрдм рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рдерд╛ рдФрд░ рдЬреАрдЖрд░рдкреАрд╕реА рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рдерд╛ рддрд╛рдХрд┐:
рдЖрдк рд░рд╛рдд рдХреЛ рдЪреИрди рд╕реЗ рд╕реЛ рд╕рдХрддреЗ рдереЗ;
рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рднреА рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдпрд╛ рдЬреАрдЖрд░рдкреАрд╕реА рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ;
рдЖрдк рдЕрдиреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рд▓рд┐рдЦрд┐рдд gRPC рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп, рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
рдЬреАрдЖрд░рдкреАрд╕реА рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рд╣реА рдХреНрдпреВрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рд┐рдЧреНрдирд▓ рдФрд░ рд╕реНрд▓реЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рд╛рдХреГрддрд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
рдЬреАрдЖрд░рдкреАрд╕реА рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛрдб рдХреЛ .proto рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ;
рдЬреАрдЖрд░рдкреАрд╕реА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдмрддрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд▓реЗрдЦ рдХреА рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдФрд░ рдЗрд╕рдХреЗ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгреЛрдВ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрд╡рд▓реЛрдХрди рд╣реЛрдЧрд╛ред рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдПрдХ рд▓рд┐рдВрдХред рдЖрдЧреЗ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдЪреАрдЬреЗрдВ рд╣реЛрдВрдЧреАред рдлрд┐рд░ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб (рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдХреНрдпрд╛ рд╣реИ) рдФрд░ рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХрд╛ рд╡рд░реНрдгрдиред
рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдореАрдХреНрд╖рд╛
рд╕рд░рд▓рддрдо pingproto.proto рдлрд╝рд╛рдЗрд▓ рдХреЛ .proto рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ RPC рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
syntax = "proto3"; package pingpong; service ping { rpc SayHello (PingRequest) returns (PingReply) {} rpc GladToSeeMe(PingRequest) returns (stream PingReply){} rpc GladToSeeYou(stream PingRequest) returns (PingReply){} rpc BothGladToSee(stream PingRequest) returns (stream PingReply){} } message PingRequest { string name = 1; string message = 2; } message PingReply { string message = 1; }
Pingpong.proto рдлрд╝рд╛рдЗрд▓ рдирд░рдХ рд╕реЗ рд╕реА ++ рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ gRPC рдореЛрдб рдкрд░ рд▓реЗрдЦ рд╕реЗ helloworld.proto рдлрд╝рд╛рдЗрд▓ рджреЛрд╣рд░рд╛рддреА рд╣реИред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдХ рд▓рд┐рдЦрд┐рдд рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
class A: public QObject { Q_OBJECT; QpingServerService pingservice; public: A() { bool is_ok; is_ok = connect(&pingservice, SIGNAL(SayHelloRequest(SayHelloCallData*)), this, SLOT(onSayHello(SayHelloCallData*))); assert(is_ok); is_ok = connect(&pingservice, SIGNAL(GladToSeeMeRequest(GladToSeeMeCallData*)), this, SLOT(onGladToSeeMe(GladToSeeMeCallData*))); assert(is_ok); is_ok = connect(&pingservice, SIGNAL(GladToSeeYouRequest(GladToSeeYouCallData*)), this, SLOT(onGladToSeeYou(GladToSeeYouCallData*))); assert(is_ok); is_ok = connect(&pingservice, SIGNAL(BothGladToSeeRequest(BothGladToSeeCallData*)), this, SLOT(onBothGladToSee(BothGladToSeeCallData*))); assert(is_ok); } public slots: void onSayHello(SayHelloCallData* cd) { std::cout << "[" << cd->peer() << "][11]: request: " << cd->request.name() << std::endl; cd->reply.set_message("hello " + cd->request.name()); cd->Finish(); }
рдЬрдм рдХреЛрдИ рдХреНрд▓рд╛рдЗрдВрдЯ RPC рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ gRPC рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрд▓рд╛рд╕ рдП) рдХреЛ рдЙрдЪрд┐рдд рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд╕рд╛рде рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред
GRPC рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
class B : public QObject { Q_OBJECT QpingClientService pingPongSrv; public: B() { bool c = false; c = connect(&pingPongSrv, SIGNAL(SayHelloResponse(SayHelloCallData*)), this, SLOT(onSayHelloResponse(SayHelloCallData*))); assert(c); c = connect(&pingPongSrv, SIGNAL(GladToSeeMeResponse(GladToSeeMeCallData*)), this, SLOT(onGladToSeeMeResponse(GladToSeeMeCallData*))); assert(c); c = connect(&pingPongSrv, SIGNAL(GladToSeeYouResponse(GladToSeeYouCallData*)), this, SLOT(onGladToSeeYouResponse(GladToSeeYouCallData*))); assert(c); c = connect(&pingPongSrv, SIGNAL(BothGladToSeeResponse(BothGladToSeeCallData*)), this, SLOT(onBothGladToSeeResponse(BothGladToSeeCallData*))); assert(c); c = connect(&pingPongSrv, SIGNAL(channelStateChanged(int, int)), this, SLOT(onPingPongStateChanged(int, int))); assert(c); } void usage() { //Unary PingRequest request; request.set_name("user"); request.set_message("user"); pingPongSrv.SayHello(request); //Server streaming PingRequest request2; request2.set_name("user"); pingPongSrv.GladToSeeMe(request2); //etc. } public slots: void SayHelloResponse(SayHelloCallData* response) { std::cout << "[11]: reply: " << response->reply.message() << std::endl; if (response->CouldBeDeleted()) delete response; } //etc. };
рдЬреАрдЖрд░рдкреАрд╕реА рдЧреНрд░рд╛рд╣рдХ рдЖрдкрдХреЛ рд╕реАрдзреЗ рдЖрд░рдкреАрд╕реА рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рдЙрдЪрд┐рдд рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░реНрд╡рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
GRPC рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рднреА рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ:
channelStateChanged(int, int);
рдЬреЛ рдкрд┐рдЫрд▓реЗ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕рд░реНрд╡рд░ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╕рднреА
рдирдореВрдирд╛ рдХреЛрдб
qgrpc рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╣реИ ред
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ gRPC рд╕рд░реНрд╡рд░ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
.Pro рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, .proto рдлрд╝рд╛рдЗрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ gRPC рдХрд╛рдо рдХрд░реЗрдЧреАред Grpc.pri рдлрд╝рд╛рдЗрд▓ рдореЗрдВ gRPC рдФрд░ QgRPC рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢ рд╣реИрдВред рдкреНрд░реЛрдЯреЛрдХ рдХрдВрдкрд╛рдЗрд▓рд░ gRPC рдлрд╛рдЗрд▓реНрд╕ [protofile] .grpc.pb.h рдФрд░ [protofile] .grpc.pb.cc рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред [рдкреНрд░реЛрдЯреЛрдлрд╛рдЗрд▓] .proto рдлрд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рд╣реИ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрдирдкреБрдЯ рдореЗрдВ рдЬрд╛рддреА рд╣реИред
QgRPC рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреАрдврд╝реА [рдкреНрд░реЛрдЯреЙрдлрд╝рд╛рдЗрд▓] .qgrpcред [рд╡рд┐рдиреНрдпрд╛рд╕] .h рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ genQGrpc.py рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред [рд╡рд┐рдиреНрдпрд╛рд╕] рдпрд╛ рддреЛ "рд╕рд░реНрд╡рд░" рдпрд╛ "рдХреНрд▓рд╛рдЗрдВрдЯ" рд╣реИред
рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ QgRPC рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ gRPC рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ Qt рдЖрд╡рд░рдг рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реА рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рд╣реЛрддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, QpingServerService рдФрд░ QpingClientService рдХрдХреНрд╖рд╛рдПрдВ рдХреНрд░рдорд╢рдГ рдЙрддреНрдкрдиреНрди рдлрд╝рд╛рдЗрд▓реЛрдВ pingpong.qgrpc.server.h рдФрд░ pingpong.qgrpc.client.h рдореЗрдВ рдШреЛрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред рдЙрддреНрдкрдиреНрди QgRPC рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ moc рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрддреНрдкрдиреНрди QgRPC рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ, QGrpc [config] .h рдлрд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗ рдкрдврд╝реЗрдВред
рдЗрд╕ рд╕рднреА рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ .pri рдлрд╝рд╛рдЗрд▓ рдХреЛ .pro рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдФрд░ рддреАрди рдЪрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред GRPC рд╡реИрд░рд┐рдПрдмрд▓ .proto рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░реЛрдЯреЛрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ genQGrpc.py рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЗрдирдкреБрдЯ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред QGRPC_CONFIG рдЪрд░ рдЙрддреНрдкрдиреНрди QgRPC рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдорд╛рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ "рд╕рд░реНрд╡рд░" рдпрд╛ "рдХреНрд▓рд╛рдЗрдВрдЯ" рдорд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЬреАрдЖрд░рдкреАрд╕реА рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ GRPC_VERSION рдЪрд░ рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдм рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, grpc.pri рдлрд╝рд╛рдЗрд▓ рдФрд░ .pro рдЙрджрд╛рд╣рд░рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝реЗрдВред
рд╕рд░реНрд╡рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░
рд╕рд░реНрд╡рд░ рд╡рд░реНрдЧ рдЖрд░реЗрдЦ рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореЛрдЯреЗ рддреАрд░ рд╡рд░реНрдЧ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдкрддрд▓реЗ рддреАрд░ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕рджрд╕реНрдпреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, Q [servicename] ServerService рд╡рд░реНрдЧ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ servicename .proto рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рд╕реЗрд╡рд╛ рдХрд╛ рдирд╛рдо рд╣реИред RPCCallData рд╕реЗрд╡рд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ RPC рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрд░рдЪрдирд╛рдПрдБ рд╣реИрдВред QpingServerService рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ, рдмреЗрд╕ рдХреНрд▓рд╛рд╕ QGrpcServerService рдХреЛ gRPC pingpong :: ping :: AsyncService рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрддрд╛ рдФрд░ рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рд╕реНрдЯрд╛рд░реНрдЯ () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕ рдкрд░ рд╕реЗрд╡рд╛ рдЪрд▓реЗрдЧреАред рдкреНрд░рд╛рд░рдВрдн () рдлрд╝рдВрдХреНрд╢рди рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рд╛рд░рдВрдн () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╢реБрджреНрдз рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рди рдореЗрдХрдПрд░реЗрдкрд┐рд╕реНрдЯреНрд╕ () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЬреЗрдирд░реЗрдЯрд┐рдВрдЧ QpingServerService рд╡рд░реНрдЧ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
void makeRequests() { needAnotherCallData< SayHello_RPCtypes, SayHelloCallData >(); needAnotherCallData< GladToSeeMe_RPCtypes, GladToSeeMeCallData >(); needAnotherCallData< GladToSeeYou_RPCtypes, GladToSeeYouCallData >(); needAnotherCallData< BothGladToSee_RPCtypes, BothGladToSeeCallData >(); }
NeedAnotherCallData рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рджреВрд╕рд░рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрддреНрдкрдиреНрди RPCCallData рд╕рдВрд░рдЪрдирд╛ рд╣реИред рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╕реЗрд╡рд╛ рдХреЗ рдЙрддреНрдкрдиреНрди рдХреНрдпреВрдЯреА рд╡рд░реНрдЧ рдореЗрдВ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред
рдЙрддреНрдкрдиреНрди RPCCallData рд╕рдВрд░рдЪрдирд╛ ServerCallData рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реАред рдмрджрд▓реЗ рдореЗрдВ, ServerCallData рд╡рд░реНрдЧ рд╕рд░реНрд╡рд░Responder рдЙрддреНрддрд░рджрд╛рддрд╛ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реБрд╕рдВрдЧрдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдПрдХ рдкреНрд░рддреНрдпреБрддреНрддрд░ рд╡рд╕реНрддреБ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред
ServerCallData рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдорд╛рддрд╛ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ: signal_func рдФрд░ request_funcред signal_func рдПрдХ рдЙрддреНрдкрдиреНрди рд╕рдВрдХреЗрдд рд╣реИ рдЬрд┐рд╕реЗ рдХрддрд╛рд░ рд╕реЗ рдЯреИрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред request_func рдПрдХ рдРрд╕рд╛ рдлрдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рдирдпрд╛ рд░реЗрд╕реНрдкреЛрдВрдбрд░ рдмрдирд╛рддреЗ рд╕рдордп рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ RequestSayHello () рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред Request_func рдХреЙрд▓ рдХреА рдЬрд░реВрд░рдд рд╣реИрдЕрдиреЛрдереЗрд░рд┐рдХрдбрд╛рд▓рдбрд╛рдЯрд╛ () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕реЗрд╡рд╛ рдореЗрдВ рдЙрддреНрддрд░рджрд╛рддрд╛рдУрдВ (рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рд▓реЛрдкрди) рдХрд╛ рдкреНрд░рдмрдВрдзрди рд╣реЛ рд╕рдХреЗред
NeedAnotherCallData () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЛрдб рдореЗрдВ рдПрдХ рд░реЗрд╕реНрдкреЛрдВрдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд░реЗрд╕реНрдкреЙрдиреНрдбрд░ рдХреЛ рдПрдХ рдЖрд░рдкреАрд╕реА рдХреЙрд▓ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:
template<class RPCCallData, class RPCTypes> void needAnotherCallData() { RPCCallData* cd = new RPCCallData();
RequestRPC () рдлрд╝рдВрдХреНрд╢рди рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП RequestRPC () рдЙрдмрд▓рддрд╛ рд╣реИ:
service_->(cd->request_func_)(...,cd->responder, (void*)cd)
рдЬрд╣рд╛рдБ рд╕реЗрд╡рд╛_ gRPC рд╕реЗрд╡рд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ pingpong :: ping :: AsyncService рд╣реИред
рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдпрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕рд▓реА рдИрд╡реЗрдВрдЯ рдХрддрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреНрд░рдорд╢рдГ CheckCQ () рдпрд╛ AsyncCheckCQ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред CheckCQ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЛрдб рдХрддрд╛рд░ рд╕реЗ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЯреИрдЧ рдФрд░ рдЗрд╕ рдЯреИрдЧ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ:
virtual void CheckCQ() override { void* tag; bool ok; server_cq_->Next(&tag, &ok); //tagActions_ call if (!tag) return; AbstractCallData* cd = (AbstractCallData*)tag; if (!started_.load()) { destroyCallData(cd); return; } cd->cqReaction(this, ok); }
рдХрддрд╛рд░ рд╕реЗ рдЯреИрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЯреИрдЧ рдФрд░ рд╕рд░реНрд╡рд░ рдкреНрд░рд╛рд░рдВрдн рдХреА рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рд╕рд░реНрд╡рд░ рдмрдВрдж рд╣реИ, рддреЛ рдЯреИрдЧ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдЗрд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, ServerCallData рд╡рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд cqReaction () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
void cqReaction(const QGrpcServerService* service_, bool ok) { if (!first_time_reaction_) { first_time_reaction_ = true; service_->needAnotherCallData<RPC, RPCCallData>(); } auto genRpcCallData = dynamic_cast<RPCCallData*>(this); void* tag = static_cast<void*>(genRpcCallData); if (this->CouldBeDeleted()) { service_->destroyCallData(this); return; } if (!this->processEvent(tag, ok)) return;
First_time_reaction_ рдзреНрд╡рдЬ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ RPC рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкреНрд░рддреНрдпреБрддреНрддрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕рдХрддреЗ рд╣реИрдВрдмреЗрдбрд▓реЗрдЯ () рдФрд░ ProcessEvent () рд╕рдВрдмрдВрдзрд┐рдд ServerResponder рдЙрддреНрддрд░рджрд╛рддрд╛ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВред CanBeDeleted () рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреБрддреНрддрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред ProcessEvent () рдлрд╝рдВрдХреНрд╢рди рдЯреИрдЧ рдФрд░ рдУрдХреЗ рдлреНрд▓реИрдЧ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрддреНрддрд░рджрд╛рддрд╛ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
bool processEvent(void* tag, bool ok) { this->tag_ = tag; read_mode_ = ok; return true; }
ProcessEvent () рдлрд╝рдВрдХреНрд╢рди, рдкреНрд░рддреНрдпреБрддреНрддрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рд╣рдореЗрд╢рд╛ рд╕рдЪ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдШрдЯрдирд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХреЙрд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
service_->(*signal_func_)(genRpcCallData)
рд╡реЗрд░рд┐рдПрдмрд▓ рд╕рд░реНрд╡рд┐рд╕_ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпреВрдкрд┐рдВрдЧрд╕рд░реНрд╡рд░ рд╕рд░реНрд╡рд┐рд╕ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╕рд░реНрд╡рд┐рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рд╡реИрд░рд┐рдПрдмрд▓ рд╕рд┐рдЧреНрдирд▓_рдлреБрдирдХ_ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд░рдкреАрд╕реА рдХреЗ рдЕрдиреБрд░реВрдк рд╕реЗрд╡рд╛ рд╕рд┐рдЧреНрдирд▓ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SayHelloRequest ()ред рдЪрд░ genRpcCallData рдЗрд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЙрддреНрддрд░рджрд╛рддрд╛ рд╡рд╕реНрддреБ рд╣реИред рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЪрд░ genRpcCallData рдЙрддреНрдкрдиреНрди RPCCallataata рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдПрдХ рдЙрджреНрджреЗрд╢реНрдп рд╣реИред
рдЧреНрд░рд╛рд╣рдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рд╕рд░реНрд╡рд░ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдЖрд░реЗрдЦ рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореЛрдЯреЗ рддреАрд░ рд╡рд░реНрдЧ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдкрддрд▓реЗ рддреАрд░ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕рджрд╕реНрдпреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП, рдХреНрдпреВ [рд╕рд░реНрд╡рд┐рд╕рд┐рдХрдирд╛рдо] рдХреНрд▓рд╛рдпрдВрдЯрд╕реЗрд╡рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рд╕рд░реНрд╡рд┐рд╕ рдирд╛рдо .pro рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рд╕реЗрд╡рд╛ рдХрд╛ рдирд╛рдо рд╣реИред RPCCallData рд╕реЗрд╡рд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ RPC рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрд░рдЪрдирд╛рдПрдБ рд╣реИрдВред RPC рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдирд╛рдо .pro рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд RPC рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, .pro RPC рдлрд╝рд╛рдЗрд▓ рдореЗрдВ SayHello () рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
rpc SayHello (PingRequest) returns (PingReply) {}
рдЙрддреНрдкрдиреНрди QpingClientService рд╡рд░реНрдЧ рдореЗрдВ, рдЗрд╕реА RPC рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
void SayHello(PingRequest request) { if(!connected()) return; SayHelloCallData* call = new SayHelloCallData; call->request = request; call->responder = stub_->AsyncSayHello(&call->context, request, &cq_); call->responder->Finish(&call->reply, &call->status, (void*)call); }
рдЙрддреНрдкрдиреНрди RPCCallData рд╕рдВрд░рдЪрдирд╛рдПрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЕрдВрддрддрдГ ClientResponder рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрддреНрдкрдиреНрди рд╕рдВрд░рдЪрдирд╛ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдПрдХ рдкреНрд░рддреНрдпреБрддреНрддрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рд░реЗрд╕реНрдкреЛрдВрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, RPC рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд░рд┐рд╕реНрдкреЛрдВрдбрд░ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдШрдЯрдирд╛ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдПрдХ RPC рдХреЙрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
void ToSayHello() { PingRequest request; request.set_name("user"); request.set_message("user"); pingPongSrv.SayHello(request); }
рдЬреЗрдирд░реЗрдЯрд┐рдВрдЧ QpingServerService рд╕рд░реНрд╡рд░ рд╡рд░реНрдЧ рдХреЗ рд╡рд┐рдкрд░реАрдд, QpingClientService рд╡рд░реНрдЧ рджреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╡рд░реНрдЧреЛрдВ рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддрд╛ рд╣реИ: рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреАрдлреНрд░реАрдЪрд░ рдФрд░ рдореЙрдирд┐рдЯрд░рдлреНрд░реАрдЪрд░ред
ConnectivityFeatures рд╡рд░реНрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреАрди рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: grpc_connect (), grpc_disconnect (), grpc_reconnect ()ред Grpc_disconnect () рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╕рднреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред Grpc_connect рдХреЗ рдХреЙрд▓ рдХреЛ grpc_connect_ () рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рдпрдВрддреНрд░рдг рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИ:
void grpc_connect_() { channel_ = grpc::CreateChannel(target_, creds_); stub_ = GRPCService::NewStub(channel_); channelFeatures_ = std::make_unique<ChannelFeatures>(channel_); channelFeatures_->checkChannelState(); }
ChannelFeatures рд╡рд░реНрдЧ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде Channel_ рдЪреИрдирд▓ рд╕рдВрдЪрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддрд╛ рд╣реИред рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреАрдлрд╛рдЗрдЯреНрд╕ рд╡рд░реНрдЧ ChannelFeatures рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ ChannelState (), checkChannelState (), рдФрд░ рдХрдиреЗрдХреНрдЯреЗрдб () рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред ChannelState () рдлрд╝рдВрдХреНрд╢рди рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдЪреИрдирд▓ рдХреЗ рдЕрдВрддрд┐рдо рджреЗрдЦреЗ рдЧрдП рд░рд╛рдЬреНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред CheckChannelState () рдлрд╝рдВрдХреНрд╢рди, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЪреИрдирд▓ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдХрдиреЗрдХреНрдЯреЗрдб () рдлрд╝рдВрдХреНрд╢рди рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреЗ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред
рдореЙрдирд┐рдЯрд░рдлреНрд░реАрдЪрд░ рд╡рд░реНрдЧ рд╕рд░реНрд╡рд░ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЪреЗрдХрд╕реАрдХреНрдпреВ () рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
bool CheckCQ() { auto service_ = dynamic_cast< SERVICE* >(this); //connection state auto old_state = conn_->channelState(); auto new_state = conn_->checkChannelState(); if (old_state != new_state) service->*channelStateChangedSignal_(old_state, new_state); //end of connection state void* tag; bool ok = false; grpc::CompletionQueue::NextStatus st; st = cq_.AsyncNext(&tag, &ok, deadlineFromMSec(100)); if ((st == grpc::CompletionQueue::SHUTDOWN) || (st == grpc::CompletionQueue::TIMEOUT)) return false; (AbstractCallData< SERVICE >*)(tag)->cqActions(service_, ok); return true; }
рдХреЛрдб рд╕рдВрд░рдЪрдирд╛ рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдорд╛рди рд╣реИред рд╕рд░реНрд╡рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдПрдХ рдХреЛрдб рдмреНрд▓реЙрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдВрдЪрд╛рд░ рдЪреИрдирд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЧрдИ рд╣реИ, рддреЛ рд╕рд┐рдЧреНрдирд▓ рдЪреИрдирд▓рд╕реНрдЯреЗрдЯрдиреЗрдЯреЗрдбрд╕рд┐рдЧреНрдирд▓_ () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рдЙрддреНрдкрдиреНрди рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ, рдпрд╣ рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ:
void channelStateChanged(int, int);
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд░реНрд╡рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, AsyncNext () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ Next () рдХреЗ рдмрдЬрд╛рдп рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, AsyncNext () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдореЗрдВ рд╕рдВрдЪрд╛рд░ рдЪреИрдирд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИред рджреВрд╕рд░реЗ, AsyncNext () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди RPC рдХреЛ рдХрд┐рд╕реА рднреА рд╕рдордп рдХреЙрд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдиреЗрдХреНрд╕реНрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдереНрд░реЗрдб рдХреЛ рддрдм рддрдХ рдмреНрд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдПрдХ рдШрдЯрдирд╛ рдХрддрд╛рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рди рд╣реЛ рдЬрд╛рдП рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рджреЛ рд╡рд░реНрдгрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЦреЛ рджреЗрдЧрд╛ред
рдХрддрд╛рд░ рд╕реЗ рдШрдЯрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЬреИрд╕рд╛ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯрдХреЙрд▓рдбреЗрдЯрд╛ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд cRReaction () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
void cqActions(RPC::Service* service, bool ok) { auto response = dynamic_cast<RPCCallData*>(this); void* tag = static_cast<void*>(response); if (!this->processEvent(tag, ok)) return; service->*func_( response ); }
рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХреЗ рд░реВрдк рдореЗрдВ, processEvent () рдлрд╝рдВрдХреНрд╢рди рдЯреИрдЧ рдФрд░ рдУрдХреЗ рдлреНрд▓реИрдЧ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛ рд╕рдЪ рд╣реЛрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдШрдЯрдирд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрддреНрдкрдиреНрди рд╕реЗрд╡рд╛ рдХрд╛ рд╕рдВрдХреЗрдд рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд░реНрд╡рд░ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИрдВред рдкрд╣рд▓рд╛ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЙрддреНрддрд░рджрд╛рддрд╛ рдирд╣реАрдВ рдмрдирд╛рдП рдЧрдП рд╣реИрдВред рдЙрддреНрддрд░рджрд╛рддрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрд░рдкреАрд╕реА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЙрддреНрддрд░рджрд╛рддрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред рдЙрддреНрддрд░рджрд╛рддрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдЕрднрд╛рд╡ рджреЛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди RPCCallData рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рд╕реЗ рдЫрд┐рдкреЗ рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдЕрдкреНрд░рд┐рдп рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ, рдкреНрд░рддреНрдпреБрддреНрддрд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рддрдереНрдп рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдХреЗрдд рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЛ рдЕрдВрддрд┐рдо рд╕рд░реНрд╡рд░ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╕рдВрдХреЗрддрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ, рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░рджрд╛рддрд╛ (рдЙрддреНрдкрдиреНрди рд╕рдВрд░рдЪрдирд╛рдУрдВ) рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди (рд╕реНрд▓реЙрдЯ) рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
void ResponseHandler(RPCCallData* response) { if (response->CouldBeDeleted()) delete response;
рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб рдореЗрдВ рдЙрддреНрддрд░рджрд╛рддрд╛ рдХреЗ рдирд┐рд╖реНрдХрд╛рд╕рди рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рди рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧреА, рдмрд▓реНрдХрд┐ рд╕рдВрдЪрд╛рд░ рдЪреИрдирд▓ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рднреА рд╣рд▓ рдХрд░реЗрдЧреАред рдирдореВрдирд╛ рдХреЛрдб рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд░рдкреАрд╕реА рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЕрдВрдд рдореЗрдВ, рд╣рдо рджреЛ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдмрд┐рдВрджреБ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдЪреЗрдХрдХреНрдпреВ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╡реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░: рдпрджрд┐ рдХрддрд╛рд░ рдореЗрдВ рдХреЛрдИ рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЙрддреНрдкрдиреНрди RPCCallData рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдХреЗрдд "рдЙрддреНрд╕рд░реНрдЬрд┐рдд" рд╣реЛрддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП (рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ) рдЪреЗрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╢реБрд░реВ рдореЗрдВ рдЬреАрдЖрд░рдкреАрд╕реА рд╕реЗ рдЬреБрдбрд╝реЗ рдкреВрд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ред рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, gRPC рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ QGrpcSrvMonitor рдФрд░ GRPC рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП QGrpcCliServer рд▓рд┐рдЦреЗ рдЧрдП рдереЗред рджреЛрдиреЛрдВ рд╡рд░реНрдЧ рдПрдХ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ: рд╡реЗ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ рд╕рд░реНрд╡рд┐рд╕ рдХреЛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ рдЗрд╕ рд╕рд░реНрд╡рд┐рд╕ рдХреЗ рдЪреЗрдХрд╕реАрдХреНрдпреВ () рдлрдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рджреЛрдиреЛрдВ рд╕рд╣рд╛рдпрдХ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдореЗрдВ CheckCQ () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЙрддреНрдкрдиреНрди рд╕реЗрд╡рд╛ рдХреЗ рд╕рдВрдХреЗрдд, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдЕрдиреНрдп рдзрд╛рд░рд╛ рд╕реЗ "рдЖрддреЗ рд╣реИрдВ"ред рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЗрди рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рджреВрд╕рд░рд╛ рдмрд┐рдВрджреБ рдЙрди рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдХреНрдпреВрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред QgRPC рдореЗрдВ Qt рд╡рд░реНрдЧ рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗрд╡рд▓ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ: рдЬрдирд░реЗрдЯ рдХреА рдЧрдИ рд╕реЗрд╡рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ, рдФрд░ рд╕рд╣рд╛рдпрдХ рдХрдХреНрд╖рд╛рдУрдВ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ: QGrpcServerMonitor.h рдФрд░ QGrpcClientMonitor.hред Qt рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд╛рд▓реА рд╢реЗрд╖ рдлрд╛рдЗрд▓реЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝реА рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рд╕реАрдореЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдХреБрдЫ рдХреНрдпреВрдЯреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╕реНрдЯрдм рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рдереАред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, QObject рд╡рд░реНрдЧ рдФрд░ Q_OBJECT рдореИрдХреНрд░реЛред рд▓реЗрдХрд┐рди рд╣рд╛рдереЛрдВ рдХреЛ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рд╕реБрдЭрд╛рд╡ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рд╡рд╣ рд╕рдм рд╣реИред рдЖрдк рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж!
рд╕рдВрджрд░реНрдн