1

次のようなプラグインを実行しようとしています。

main process()
{
   call plugin to do something;
}

plugin()
{
   PART A: to encode a message, and send to other app;
   PART B: to decode a message, and call PART A to check whether we need to send more messages.
}

したがって、PART B の場合、応答が返されたときに自動的に呼び出されます。PARTBにいるときはPART Aに戻りますが、PART Aにいるので、PART Bを直接呼び出すことはできません。これは、応答が返されたときに呼び出す必要があるためです。非同期呼び出しでループするにはどうすればよいですか? メッセージを送って、返事が来るまでの待ち方をPART Bに。ご提案ありがとうございます。

4

1 に答える 1

2

これは、メイン プロセスの実装とプラグインの設計次第です。たとえば、次のようなものがあります。

struct message;
typedef std::function<bool(message&)> message_handler;
struct IMainProcess {
    virtual int add_listener( message_handler const& f ) = 0;
    virtual void remove_listener( int key ) = 0;
};
struct IPlugin {
    virtual bool initialize( IMainProcess* p ) = 0;
    virtual void shutdown() = 0;
};

struct MainProcess : IMainProcess {
    int key;
    std::map<int, message_handler > listeners;
    MainProcess() : key( 0 ) {}
    virtual int add_listener( message_handler const& f ) {
        int res = key++;
        listeners[key] = f;
    }
    virtual void remove_listener( int key ) {
        listeners.erase( key );
    }

    void message_received( message& m ) {
        // call all plugins that registered for incoming messages
        for( auto i = listeners.begin(); i != listeners.end(); i++ ) {
            if( !i->second(m) ) break;
        }
    }
};
int main() {
    MainProcess mp;
    // Load plugins from some location and initialize them
    std::vector<std::auto_ptr<IPlugin> > plugins;
    while( IPlugin* p = load_plugin() ) {
        std::auto_ptr<IPlugin> sp( p );
        if( p->initialize(&mp) ) plugins.push_back( sp );
    }
    while( message* msg = wait_for_message() ) {
        std::auto_ptr<message> smsg( msg );
        mp.message_received( *msg );
    }
    // end of operation
    for( auto i = plugins.begin(); i != plugins.end(); i++ ) {
        (*i)->shutdown();
    }
    return 0;
}

プラグインは任意のアーキテクチャを持つことができ、着信メッセージを受信することもできます!

于 2012-10-17T10:10:57.850 に答える