123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- //
- // ActiveRunnable.h
- //
- // Library: Foundation
- // Package: Threading
- // Module: ActiveObjects
- //
- // Definition of the ActiveRunnable class.
- //
- // Copyright (c) 2004-2007, Applied Informatics Software Engineering GmbH.
- // and Contributors.
- //
- // SPDX-License-Identifier: BSL-1.0
- //
- #ifndef Foundation_ActiveRunnable_INCLUDED
- #define Foundation_ActiveRunnable_INCLUDED
- #include "Poco/Foundation.h"
- #include "Poco/ActiveResult.h"
- #include "Poco/Runnable.h"
- #include "Poco/RefCountedObject.h"
- #include "Poco/AutoPtr.h"
- #include "Poco/Exception.h"
- namespace Poco {
- class ActiveRunnableBase: public Runnable, public RefCountedObject
- /// The base class for all ActiveRunnable instantiations.
- {
- public:
- typedef AutoPtr<ActiveRunnableBase> Ptr;
- };
- template <class ResultType, class ArgType, class OwnerType>
- class ActiveRunnable: public ActiveRunnableBase
- /// This class is used by ActiveMethod.
- /// See the ActiveMethod class for more information.
- {
- public:
- typedef ResultType (OwnerType::*Callback)(const ArgType&);
- typedef ActiveResult<ResultType> ActiveResultType;
- ActiveRunnable(OwnerType* pOwner, Callback method, const ArgType& arg, const ActiveResultType& result):
- _pOwner(pOwner),
- _method(method),
- _arg(arg),
- _result(result)
- {
- poco_check_ptr (pOwner);
- }
- void run()
- {
- ActiveRunnableBase::Ptr guard(this, false); // ensure automatic release when done
- try
- {
- _result.data(new ResultType((_pOwner->*_method)(_arg)));
- }
- catch (Exception& e)
- {
- _result.error(e);
- }
- catch (std::exception& e)
- {
- _result.error(e.what());
- }
- catch (...)
- {
- _result.error("unknown exception");
- }
- _result.notify();
- }
- private:
- OwnerType* _pOwner;
- Callback _method;
- ArgType _arg;
- ActiveResultType _result;
- };
- template <class ArgType, class OwnerType>
- class ActiveRunnable<void, ArgType, OwnerType>: public ActiveRunnableBase
- /// This class is used by ActiveMethod.
- /// See the ActiveMethod class for more information.
- {
- public:
- typedef void (OwnerType::*Callback)(const ArgType&);
- typedef ActiveResult<void> ActiveResultType;
- ActiveRunnable(OwnerType* pOwner, Callback method, const ArgType& arg, const ActiveResultType& result):
- _pOwner(pOwner),
- _method(method),
- _arg(arg),
- _result(result)
- {
- poco_check_ptr (pOwner);
- }
- void run()
- {
- ActiveRunnableBase::Ptr guard(this, false); // ensure automatic release when done
- try
- {
- (_pOwner->*_method)(_arg);
- }
- catch (Exception& e)
- {
- _result.error(e);
- }
- catch (std::exception& e)
- {
- _result.error(e.what());
- }
- catch (...)
- {
- _result.error("unknown exception");
- }
- _result.notify();
- }
- private:
- OwnerType* _pOwner;
- Callback _method;
- ArgType _arg;
- ActiveResultType _result;
- };
- template <class ResultType, class OwnerType>
- class ActiveRunnable<ResultType, void, OwnerType>: public ActiveRunnableBase
- /// This class is used by ActiveMethod.
- /// See the ActiveMethod class for more information.
- {
- public:
- typedef ResultType (OwnerType::*Callback)();
- typedef ActiveResult<ResultType> ActiveResultType;
- ActiveRunnable(OwnerType* pOwner, Callback method, const ActiveResultType& result):
- _pOwner(pOwner),
- _method(method),
- _result(result)
- {
- poco_check_ptr (pOwner);
- }
- void run()
- {
- ActiveRunnableBase::Ptr guard(this, false); // ensure automatic release when done
- try
- {
- _result.data(new ResultType((_pOwner->*_method)()));
- }
- catch (Exception& e)
- {
- _result.error(e);
- }
- catch (std::exception& e)
- {
- _result.error(e.what());
- }
- catch (...)
- {
- _result.error("unknown exception");
- }
- _result.notify();
- }
- private:
- OwnerType* _pOwner;
- Callback _method;
- ActiveResultType _result;
- };
- template <class OwnerType>
- class ActiveRunnable<void, void, OwnerType>: public ActiveRunnableBase
- /// This class is used by ActiveMethod.
- /// See the ActiveMethod class for more information.
- {
- public:
- typedef void (OwnerType::*Callback)();
- typedef ActiveResult<void> ActiveResultType;
- ActiveRunnable(OwnerType* pOwner, Callback method, const ActiveResultType& result):
- _pOwner(pOwner),
- _method(method),
- _result(result)
- {
- poco_check_ptr (pOwner);
- }
- void run()
- {
- ActiveRunnableBase::Ptr guard(this, false); // ensure automatic release when done
- try
- {
- (_pOwner->*_method)();
- }
- catch (Exception& e)
- {
- _result.error(e);
- }
- catch (std::exception& e)
- {
- _result.error(e.what());
- }
- catch (...)
- {
- _result.error("unknown exception");
- }
- _result.notify();
- }
- private:
- OwnerType* _pOwner;
- Callback _method;
- ActiveResultType _result;
- };
- } // namespace Poco
- #endif // Foundation_ActiveRunnable_INCLUDED
|