Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Success/Error Virtual Methods

Boost , Chapter 1. Fiber , Integrating Fibers with Asynchronous Callbacks

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Одним из классических подходов к уведомлению о завершении является определение абстрактного базового класса с помощью методов<success()>и<error()>. Код, желающий выполнить I/O асинка, должен вывести подкласс, переопределить каждый из этих методов и передать операцию асинка указателем на экземпляр подкласса. Абстрактный базовый класс может выглядеть так:

// every async operation receives a subclass instance of this abstract base
// class through which to communicate its result
struct Response {
    typedef std::shared_ptr< Response > ptr;
    // called if the operation succeeds
    virtual void success( std::string const& data) = 0;
    // called if the operation fails
    virtual void error( AsyncAPIBase::errorcode ec) = 0;
};

Теперь операция<AsyncAPI>может выглядеть следующим образом:

// derive Response subclass, instantiate, pass Response::ptr
void init_read( Response::ptr);

Мы можем решить эту проблему, написав универсальный<PromiseResponse>:

class PromiseResponse: public Response {
public:
    // called if the operation succeeds
    virtual void success( std::string const& data) {
        promise_.set_value( data);
    }
    // called if the operation fails
    virtual void error( AsyncAPIBase::errorcode ec) {
        promise_.set_exception(
                std::make_exception_ptr(
                    make_exception("read", ec) ) );
    }
    boost::fibers::future< std::string > get_future() {
        return promise_.get_future();
    }
private:
    boost::fibers::promise< std::string >   promise_;
};

Теперь мы можем просто получить<future<>>от этого<PromiseResponse>и ждать его.<get()>:

std::string read( AsyncAPI & api) {
    // Because init_read() requires a shared_ptr, we must allocate our
    // ResponsePromise on the heap, even though we know its lifespan.
    auto promisep( std::make_shared< PromiseResponse >() );
    boost::fibers::future< std::string > future( promisep->get_future() );
    // Both 'promisep' and 'future' will survive until our lambda has been
    // called.
    api.init_read( promisep);
    return future.get();
}

Приведенный выше исходный код содержится вadapt_callbacks.cppиadapt_method_calls.cpp..


PrevUpHomeNext

Статья Success/Error Virtual Methods раздела Chapter 1. Fiber Integrating Fibers with Asynchronous Callbacks может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Integrating Fibers with Asynchronous Callbacks ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 02:11:05/0.0053679943084717/1