рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ? SObjectizer рджреГрд╖реНрдЯрд┐рдХреЛрдг

рдЕрднрд┐рдиреЗрддрд╛ рд╕рд╛рдЭрд╛, рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рдпреЛрдЧреНрдп рд░рд╛рдЬреНрдп рд╕реЗ рдмрдЪрдХрд░ рдмрд╣реБ-рд╕реВрддреНрд░реАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЕрднрд┐рдиреЗрддрд╛ рдХрд╛ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдХреЛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЕрднрд┐рдиреЗрддрд╛ рдХреЗрд╡рд▓ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рджреМрдбрд╝ рдФрд░ рдЧрддрд┐рд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд╕рдмрд╕реЗ рднрдпрд╛рдирдХ рднрдп рдбрд░рд╛рд╡рдиреЗ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЛ рдЙрдирдХреА рдкрд░реЗрд╢рд╛рдиреА рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдм рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ)ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдФрд░ рд╕реБрдЦрдж рд╣реИред рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЕрднрд┐рдиреЗрддрд╛ рд╕реНрд╡рдпрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рдЖрдк рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрднрд┐рдиреЗрддрд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдиреМрдХрд░реА рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдЕрднрд┐рдиреЗрддрд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: "рдЕрдкрдиреЗ рдХрд╛рдо рдХреА рд╢реБрджреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреИрд╕реЗ рдХрд░реЗрдВ?"

рд╕рд╡рд╛рд▓ рд╡рд╛рдХрдИ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдЬрдм рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ SObjectizer рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдорд╕реЗ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдкреВрдЫрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рддрдХ, рд╣рдо рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗ рд╕рдХрддреЗ рдереЗред

рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 5.5.24 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ , рдЬрд┐рд╕рдореЗрдВ рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЗ рдпреВрдирд┐рдЯ-рдкрд░реАрдХреНрд╖рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╕рдорд░реНрдерди рдерд╛ред рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдЕрднрд┐рдиреЗрддрд╛ рдкрд░реАрдХреНрд╖рдг рдХреНрдпрд╛ рджрд┐рдЦрддреЗ рд╣реИрдВ?


рд╣рдо рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ SObjectizer рдХреА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╕рд╛рде рдореЗрдВ рдЪрд▓ рд░рд╣реА рд╣реИрдВред рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдЗрд╕ рднрдВрдбрд╛рд░ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдкреВрд░реА рдХрд╣рд╛рдиреА рдХреЗ рджреМрд░рд╛рди, "рдЕрднрд┐рдиреЗрддрд╛" рдФрд░ "рдПрдЬреЗрдВрдЯ" рд╢рдмреНрджреЛрдВ рдХрд╛ рдкрд░рд╕реНрдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡реЗ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЛ рдирд╛рдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди SObjectizer рдореЗрдВ "рдПрдЬреЗрдВрдЯ" рд╢рдмреНрдж рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдЧреЗ "рдПрдЬреЗрдВрдЯ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

Pinger рдФрд░ Ponger рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг


рдЕрднрд┐рдиреЗрддрд╛ Pinger рдФрд░ Ponger рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдВрднрд╡рддрдГ рдЕрднрд┐рдиреЗрддрд╛ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрдо рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЗрд╕реЗ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдХреНрд▓рд╛рд╕рд┐рдХреНрд╕ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред

рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ Pinger Agent рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ Ponger рдПрдЬреЗрдВрдЯ рдХреЛ рдПрдХ рдкрд┐рдВрдЧ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред рдФрд░ Ponger рдПрдЬреЗрдВрдЯ рдПрдХ Pong рд╕рдВрджреЗрд╢ рд╡рд╛рдкрд╕ рднреЗрдЬрддрд╛ рд╣реИред рдпрд╣ C ++ рдХреЛрдб рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

// Types of signals to be used. struct ping final : so_5::signal_t {}; struct pong final : so_5::signal_t {}; // Pinger agent. class pinger_t final : public so_5::agent_t { so_5::mbox_t m_target; public : pinger_t( context_t ctx ) : so_5::agent_t{ std::move(ctx) } { so_subscribe_self().event( [this](mhood_t<pong>) { so_deregister_agent_coop_normally(); } ); } void set_target( const so_5::mbox_t & to ) { m_target = to; } void so_evt_start() override { so_5::send< ping >( m_target ); } }; // Ponger agent. class ponger_t final : public so_5::agent_t { so_5::mbox_t m_target; public : ponger_t( context_t ctx ) : so_5::agent_t{ std::move(ctx) } { so_subscribe_self().event( [this](mhood_t<ping>) { so_5::send< pong >( m_target ); } ); } void set_target( const so_5::mbox_t & to ) { m_target = to; } }; 

рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╣реИ рдЬреЛ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдЗрди рдПрдЬреЗрдВрдЯреЛрдВ рдХреЛ рдПрд╕рдмрд┐рдЬрд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдкрд░, рдкреЛрдВрдЧрд░ рдХреЛ рдПрдХ рдкрд┐рдВрдЧ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рдФрд░ рдкрд┐рдВрдЧрд░ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рдкреЛрдВрдЧ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рдареАрдХ рд╣реИред рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ doctest рдпреВрдирд┐рдЯ-рдЯреЗрд╕реНрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

 #define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN #include <doctest/doctest.h> #include <ping_pong/agents.hpp> #include <so_5/experimental/testing.hpp> namespace tests = so_5::experimental::testing; TEST_CASE( "ping_pong" ) { tests::testing_env_t sobj; pinger_t * pinger{}; ponger_t * ponger{}; sobj.environment().introduce_coop([&](so_5::coop_t & coop) { pinger = coop.make_agent< pinger_t >(); ponger = coop.make_agent< ponger_t >(); pinger->set_target( ponger->so_direct_mbox() ); ponger->set_target( pinger->so_direct_mbox() ); }); sobj.scenario().define_step("ping") .when(*ponger & tests::reacts_to<ping>()); sobj.scenario().define_step("pong") .when(*pinger & tests::reacts_to<pong>()); sobj.scenario().run_for(std::chrono::milliseconds(100)); REQUIRE(tests::completed() == sobj.scenario().result()); } 

рдпрд╣ рдЖрд╕рд╛рди рд▓рдЧ рд░рд╣рд╛ рд╣реИред рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдЬреЗрдВрдЯ рдкрд░реАрдХреНрд╖рдг рд╕рдорд░реНрдерди рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ:

 #include <so_5/experimental/testing.hpp> 

рдпреЗ рд╕рднреА рдЙрдкрдХрд░рдг so_5 :: рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ :: рдкрд░реАрдХреНрд╖рдг рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрддрдиреЗ рд▓рдВрдмреЗ рдирд╛рдо рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд╣рдо рдПрдХ рдЫреЛрдЯреЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдирд╛рдо рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ:

 namespace tests = so_5::experimental::testing; 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рдПрдХрд▓ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХрд╛ рд╡рд░реНрдгрди рд╣реИ (рдФрд░ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдФрд░ рдЕрдзрд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред

рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЗ рдЕрдВрджрд░, рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ SObjectizer рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╣реИ:

 tests::testing_env_t sobj; 

рдЗрд╕ рдорд╛рд╣реМрд▓ рдХреЗ рдмрд┐рдирд╛, рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП "рдЯреЗрд╕реНрдЯ рд░рди" рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

Test_env_t рд╡рд░реНрдЧ SObjectizer рдореЗрдВ рд▓рд┐рдкрдЯреЗ_env_t рд╡рд░реНрдЧ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЙрд╕реА рддрд░рд╣, рдПрд╕рдУрдмреАрдЬреЗрд▓рд╛рдЗрдЬрд╝рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рд░реБрдХ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп, рдЖрдкрдХреЛ SObjectizer рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рд░реЛрдХрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ Pinger рдФрд░ Ponger рдПрдЬреЗрдВрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рддрдерд╛рдХрдерд┐рдд рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЗрди рдПрдЬреЗрдВрдЯреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред "рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рджреГрд╢реНрдпред" рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрд▓рдЧ рд╕реЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдПрдЬреЗрдВрдЯреНрд╕ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ:

 pinger_t * pinger{}; ponger_t * ponger{}; sobj.environment().introduce_coop([&](so_5::coop_t & coop) { pinger = coop.make_agent< pinger_t >(); ponger = coop.make_agent< ponger_t >(); pinger->set_target( ponger->so_direct_mbox() ); ponger->set_target( pinger->so_direct_mbox() ); }); 

рдФрд░ рдлрд┐рд░ рд╣рдо "рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рджреГрд╢реНрдп" рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдПрдХ рдРрд╕рд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЪрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реАрдзрд╛ рдХреНрд░рдо рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╢реБрд░реВ рд╕реЗ рдЕрдВрдд рддрдХ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рдПрдХ рдкреНрд░рддреНрдпрдХреНрд╖ рдЕрдиреБрдХреНрд░рдо рд╕реЗ" рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ SObjectizer-5.5.24 рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд░рдг "рдХрд╛рд░реНрдп" рд╕рдЦреНрддреА рд╕реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╢рд╛рдЦрд╛ рдпрд╛ рд▓реВрдк рдХреЗред

рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╛рдиреА рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдмрд╣реБрдд рдЖрдЦрд┐рд░реА рддрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рджреЛ-рдЪрд░рдг рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдЪрд░рдг рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреЛрдВрдЧрд░ рдПрдЬреЗрдВрдЯ рдкрд┐рдВрдЧ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛:

 sobj.scenario().define_step("ping") .when(*ponger & tests::reacts_to<ping>()); 

рджреВрд╕рд░рд╛ рдЪрд░рдг рдпрд╣ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ Pinger рдПрдЬреЗрдВрдЯ рдХреЛ Pong рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

 sobj.scenario().define_step("pong") .when(*pinger & tests::reacts_to<pong>()); 

рдпреЗ рджреЛ рдЪрд░рдг рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдЙрдирдХреЗ рдирд┐рд░реНрдзрд╛рд░рдг рдХреЗ рдмрд╛рдж, рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ 100ms рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдЪрд▓рдиреЗ рджреЗрддреЗ рд╣реИрдВ:

 sobj.scenario().run_for(std::chrono::milliseconds(100)); 

рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП рд╕реМ рдПрдЬреЗрдВрдЯреЛрдВ рдХреЛ рджреЛ рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рднрд▓реЗ рд╣реА рдкрд░реАрдХреНрд╖рдг рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдЖрднрд╛рд╕реА рдорд╢реАрди рдХреЗ рдЕрдВрджрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдХрднреА-рдХрднреА рдЯреНрд░реИрд╡рд┐рд╕ рд╕реАрдЖрдИ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ)ред рдареАрдХ рд╣реИ, рдЕрдЧрд░ рд╣рдордиреЗ рдПрдЬреЗрдВрдЯреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЧрд▓рддреА рдХреА рд╣реИ рдпрд╛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ, рддреЛ 100 рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд▓рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдЗрд╕рд▓рд┐рдП, run_for () рд╕реЗ рд▓реМрдЯрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ рддреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдмрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ:

 REQUIRE(tests::completed() == sobj.scenario().result()); 

рдпрджрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░реА рдирд╣реАрдВ рд╣реБрдИ, рддреЛ рдЗрд╕рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рд╣реЛрдЧреАред

рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдФрд░ рдкрд░рд┐рд╡рд░реНрдзрди


рдпрджрд┐ рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп SObjectizer рдХреЗ рдЕрдВрджрд░ рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ:

 pinger_t * pinger{}; ponger_t * ponger{}; sobj.environment().introduce_coop([&](so_5::coop_t & coop) { pinger = coop.make_agent< pinger_t >(); ponger = coop.make_agent< ponger_t >(); pinger->set_target( ponger->so_direct_mbox() ); ponger->set_target( pinger->so_direct_mbox() ); }); 

рдлрд┐рд░, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, Pinger рдФрд░ Ponger рдПрдЬреЗрдВрдЯ рд╕рдВрджреЗрд╢ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдкрд░рд┐рдЪрдп_рдХреЛрдк (рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рдЪрдорддреНрдХрд╛рд░ рдРрд╕реЗ рд╣реИрдВ) рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдЕрдВрджрд░, рдЬреЛ test_env_t рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдкрд┐рдВрдЧрд░ рдФрд░ рдкреЛрдВрдЧрд░ рдПрдЬреЗрдВрдЯ рдзреИрд░реНрдпрдкреВрд░реНрд╡рдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рд╣рдо рдЕрдкрдиреА рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдпрд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ?

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдЕрдВрджрд░, рдПрдЬреЗрдВрдЯ рдЬрдореЗ рд╣реБрдП рд░рд╛рдЬреНрдп рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдпрд╛рдиреА рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж, рд╡реЗ SObjectizer рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрдкрдиреЗ рдХрд┐рд╕реА рднреА рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕рд▓рд┐рдП, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ so_evt_start () рдХреЛ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬрдм рд╣рдо run_for () рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╣рд▓реЗ рд╕рднреА рдЬрдореЗ рд╣реБрдП рдПрдЬреЗрдВрдЯреЛрдВ рдХреЛ рдбреАрдлреНрд░реЙрд╕реНрдЯ рдХрд░рддреА рд╣реИред рдФрд░ рдлрд┐рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ SObjectizer рд╕реЗ рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреЛрдВрдЧрд░ рдПрдЬреЗрдВрдЯ рдиреЗ рдкрд┐рдВрдЧ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рдХрд┐ рдкреЛрдВрдЧрд░ рдПрдЬреЗрдВрдЯ рдиреЗ рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдЬрдм рдЗрд╕ рддрд░рд╣ рдХреА рд╕реВрдЪрдирд╛рдПрдВ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЖрдиреЗ рд▓рдЧрддреА рд╣реИрдВ, рддреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ "рдХреЛрд╢рд┐рд╢" рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИред рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реВрдЪрдирд╛ рд╣реИ рдХрд┐ рдкреЛрдВрдЧрд░ рдиреЗ рдкрд┐рдВрдЧ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ - рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдпрд╛ рдирд╣реАрдВ? рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрджрдо рдХрд╛ рд╡рд░реНрдгрди рдмрд┐рд▓реНрдХреБрд▓ рдпрд╣реА рдХрд╣рддрд╛ рд╣реИ: рдпрд╣ рддрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдкреЛрдВрдЧрд░ рдкрд┐рдВрдЧ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдХреЛрдб рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ:

 .when(*ponger & tests::reacts_to<ping>()) 

рдареАрдХ рд╣реИред рддреЛ рдкрд╣рд▓рд╛ рдХрджрдо рдХрд╛рдо рдХрд┐рдпрд╛, рдЕрдЧрд▓реЗ рдЪрд░рдг рдкрд░ рдЬрд╛рдПрдВред

рдЗрд╕рдХреЗ рдмрд╛рдж рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдЖрддреА рд╣реИ рдХрд┐ рдПрдЬреЗрдВрдЯ рдкрд┐рдВрдЧрд░ рдиреЗ рдкреЛрдВрдЧ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреА рд╣реИред рдФрд░ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рд┐рдП:

 .when(*pinger & tests::reacts_to<pong>()) 

рдареАрдХ рд╣реИред рддреЛ рджреВрд╕рд░рд╛ рдХрджрдо рдХрд╛рдо рдХрд┐рдпрд╛, рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдФрд░ рд╣реИ? рдирд╣реАрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдВрдкреВрд░реНрдг рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рдЖрдк run_for () рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд╣рд▓реБрдУрдВ рдХреЛ рд╕реНрдкрд░реНрд╢ рдХрд░реЗрдВрдЧреЗред

рдЙрджрд╛рд╣рд░рдг рджрд╛рд░реНрд╢рдирд┐рдХ рджрд░реНрд╢рди


рдкрд░реАрдХреНрд╖рдг рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкреНрд░рд╕рд┐рджреНрдз рдХрд╛рд░реНрдп "рдбрд╛рдЗрдирд┐рдВрдЧ рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ" рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдкрд░, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдо рд╕рдмрд╕реЗ рддреБрдЪреНрдЫ рд╕рдорд╛рдзрд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ: рдЕрднрд┐рдиреЗрддрд╛ рдФрд░ рджрд╛рд░реНрд╢рдирд┐рдХ рджреЛрдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдХреЛ рд╕рдВрдШрд░реНрд╖ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рджрд╛рд░реНрд╢рдирд┐рдХ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рд╕реЛрдЪрддрд╛ рд╣реИ, рдлрд┐рд░ рдмрд╛рдИрдВ рдУрд░ рдХрд╛рдВрдЯрд╛ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдХрд╛рдВрдЯреЗ рдХреЛ рджрд╛рдИрдВ рдУрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╕рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджрд╛рд░реНрд╢рдирд┐рдХ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЦрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡рд╣ рдХрд╛рдВрдЯреЗ рдбрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рд╕реЛрдЪрдиреЗ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдкреНрд▓рдЧ рдХреЛ рджрд╛рдИрдВ рдУрд░ рд▓реЗ рдЬрд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ (рдпрд╛рдиреА, рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рджрд╛рд░реНрд╢рдирд┐рдХ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛), рддреЛ рджрд╛рд░реНрд╢рдирд┐рдХ рдкреНрд▓рдЧ рдХреЛ рдмрд╛рдИрдВ рдУрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдФрд░ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕реЛрдЪрддрд╛ рд╣реИред рдпрд╛рдиреА рдпрд╣ рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреБрдЫ рджрд╛рд░реНрд╢рдирд┐рдХ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рднреВрдЦреЗ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рддрдм рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдФрд░ рдПрдЬреЗрдВрдЯреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИред

рдлреЛрд░реНрдХ рдФрд░ рджрд╛рд░реНрд╢рдирд┐рдХ рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ , рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдХрд╛рдВрдЯрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг


рдбрд╛рдЗрдирд┐рдВрдЧ рдлрд┐рд▓реЛрд╕реЙрдлрд░реНрд╕ рдХреЗ рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдкрд░реАрдХреНрд╖рдг рдПрдЬреЗрдВрдЯ рдлреЛрд░реНрдХ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ред

рдпрд╣ рдПрдЬреЗрдВрдЯ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рджреЛ рд░рд╛рдЬреНрдп рд╣реИрдВ: рдлреНрд░реА рдФрд░ рдЯреЗрдХрдиред рдЬрдм рдПрдЬреЗрдВрдЯ рдлреНрд░реА рд╕реНрдЯреЗрдЯ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЯреЗрдХ рд╕рдВрджреЗрд╢ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдЬреЗрдВрдЯ рдЯреЗрдХрди рд░рд╛рдЬреНрдп рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЯреЗрдХрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред

рдЬрдм рдПрдЬреЗрдВрдЯ рдЯреЗрдХрди рд░рд╛рдЬреНрдп рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рд╕рдВрджреЗрд╢ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд▓реЗрддрд╛ рд╣реИ: рдПрдЬреЗрдВрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИ, рдФрд░ рд╡реНрдпрд╕реНрддрддрд╛ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЯреЗрдХрди рд░рд╛рдЬреНрдп рдореЗрдВ рднреА, рдПрдЬреЗрдВрдЯ рдкреБрдЯ рд╕рдВрджреЗрд╢ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ: рдПрдЬреЗрдВрдЯ рдореБрдХреНрдд рд░рд╛рдЬреНрдп рдореЗрдВ рд▓реМрдЯрддрд╛ рд╣реИред

рдореБрдХреНрдд рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ, рдкреБрдЯ рд╕рдВрджреЗрд╢ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдПрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ:

 TEST_CASE( "fork" ) { class pseudo_philosopher_t final : public so_5::agent_t { public: pseudo_philosopher_t(context_t ctx) : so_5::agent_t{std::move(ctx)} { so_subscribe_self() .event([](mhood_t<msg_taken>) {}) .event([](mhood_t<msg_busy>) {}); } }; tests::testing_env_t sobj; so_5::agent_t * fork{}; so_5::agent_t * philosopher{}; sobj.environment().introduce_coop([&](so_5::coop_t & coop) { fork = coop.make_agent<fork_t>(); philosopher = coop.make_agent<pseudo_philosopher_t>(); }); sobj.scenario().define_step("put_when_free") .impact<msg_put>(*fork) .when(*fork & tests::ignores<msg_put>()); sobj.scenario().define_step("take_when_free") .impact<msg_take>(*fork, philosopher->so_direct_mbox()) .when_all( *fork & tests::reacts_to<msg_take>() & tests::store_state_name("fork"), *philosopher & tests::reacts_to<msg_taken>()); sobj.scenario().define_step("take_when_taken") .impact<msg_take>(*fork, philosopher->so_direct_mbox()) .when_all( *fork & tests::reacts_to<msg_take>(), *philosopher & tests::reacts_to<msg_busy>()); sobj.scenario().define_step("put_when_taken") .impact<msg_put>(*fork) .when( *fork & tests::reacts_to<msg_put>() & tests::store_state_name("fork")); sobj.scenario().run_for(std::chrono::milliseconds(100)); REQUIRE(tests::completed() == sobj.scenario().result()); REQUIRE("taken" == sobj.scenario().stored_state_name("take_when_free", "fork")); REQUIRE("free" == sobj.scenario().stored_state_name("put_when_taken", "fork")); } 

рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрди рд╣рд┐рд╕реНрд╕реЛрдВ рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗ, рдЬреЛ рдЙрди рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рд╣рдореЗрдВ рдпрд╣рд╛рдБ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ рдЕрд╕рд▓реА рдлрд┐рд▓реЛрд╕реЛрдлрд╝рд░ рдПрдЬреЗрдВрдЯ рдХреЛ рдмрджрд▓рдирд╛ред рдПрдХ рдлреЛрд░реНрдХ рдПрдЬреЗрдВрдЯ рдХреЛ рдХрд┐рд╕реА рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрд┐рд╕реА рдХреЛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджрд╛рд░реНрд╢рдирд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджрд╛рд░реНрд╢рдирд┐рдХ рдПрдЬреЗрдВрдЯ рдХрд╛ рдЕрдкрдирд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рддрд░реНрдХ рд╣реИ, рд╡рд╣ рд╕реНрд╡рдпрдВ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рд╣рдорд╛рд░реЗ рдпрд╣рд╛рдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░реЗрдЧреАред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдореЙрдХрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВрдЧреЗ: рдПрдХ рдЦрд╛рд▓реА рдПрдЬреЗрдВрдЯ рдЬреЛ рд╕реНрд╡рдпрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рднреЗрдЬрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧреА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдЫрджреНрдо-рдлрд┐рд▓реЛрд╕реЛрдлрд░ рд╣реИ:

 class pseudo_philosopher_t final : public so_5::agent_t { public: pseudo_philosopher_t(context_t ctx) : so_5::agent_t{std::move(ctx)} { so_subscribe_self() .event([](mhood_t<msg_taken>) {}) .event([](mhood_t<msg_busy>) {}); } }; 

рдЕрдЧрд▓рд╛, рд╣рдо рдлреЛрд░реНрдХ рдПрдЬреЗрдВрдЯ рдФрд░ рд╕реНрдпреВрдбреЛрдлрд┐рд▓реЛрд╕реНрдлреЗрдпрд░ рдПрдЬреЗрдВрдЯ рд╕реЗ рдПрдХ рд╕рд╣рдпреЛрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд╣рд▓рд╛ рдЪрд░рдг рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдлрд╝рд░реНрдХ, рдлрд╝реНрд░реА рд╕реНрдЯреЗрдЯ рдореЗрдВ рд╣реЛрдирд╛ (рдФрд░ рдпрд╣ рдЗрд╕рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рд╣реИ), рдкреБрдЯ рд╕рдВрджреЗрд╢ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдВрдЪ рдХреИрд╕реЗ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ:

 sobj.scenario().define_step("put_when_free") .impact<msg_put>(*fork) .when(*fork & tests::ignores<msg_put>()); 

рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкрд╣рд▓реА рдЪреАрдЬ рдкреНрд░рднрд╛рд╡ рдирд┐рд░реНрдорд╛рдг рд╣реИред

рдЙрд╕реЗ рдЬрд░реВрд░рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдПрдЬреЗрдВрдЯ рдлреЛрд░реНрдХ рдЦреБрдж рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рдХреЗрд╡рд▓ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА рдХреЛ рдПрдЬреЗрдВрдЯ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдХреМрди?

рд▓реЗрдХрд┐рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдЯреЗрдк рд╕реНрд╡рдпрдВ рдкреНрд░рднрд╛рд╡ рд╕реЗ рднреЗрдЬрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░рднрд╛рд╡ рд╕рд╛рдорд╛рдиреНрдп рднреЗрдЬрдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ (рдФрд░ рдкреНрд░рд╛рд░реВрдк рд╕рдорд╛рди рд╣реИ)ред

рдЦреИрд░, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдЯреЗрдк рд╣реА рдкреНрд░рднрд╛рд╡ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рд╡рд╣ рдХрдм рдХрд░реЗрдЧрд╛?

рдФрд░ рдЬрдм рдмрд╛рд░реА рдЖрдПрдЧреА рддрдм рд╡рд╣ рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗред рдпрд╛рдиреА рдпрджрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрджрдо рдкрд╣рд▓реЗ рд╣реИ, рддреЛ рдкреНрд░рднрд╛рд╡ рдХреЛ run_for рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрджрдо рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреНрд░рднрд╛рд╡ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреИрд╕реЗ рд╣реА рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдЧрд▓реЗ рдЪрд░рдг рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдЧреАред

рджреВрд╕рд░реА рдмрд╛рдд рдЬрд┐рд╕ рдкрд░ рд╣рдореЗрдВ рдпрд╣рд╛рдБ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рдЗрдЧреНрдиреЛрд░ред рдпрд╣ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдПрдЬреЗрдВрдЯ рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рддреЛ рдЪрд░рдг рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛рдиреА рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, Fork рдПрдЬреЗрдВрдЯ рдХреЛ рдкреБрдЯ рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрдЗрдП рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдПрдХ рдФрд░ рдЪрд░рдг рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 sobj.scenario().define_step("take_when_free") .impact<msg_take>(*fork, philosopher->so_direct_mbox()) .when_all( *fork & tests::reacts_to<msg_take>() & tests::store_state_name("fork"), *philosopher & tests::reacts_to<msg_taken>()); 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣рд╛рдБ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХрдм, рдХрдм рдХреЗ рдмрдЬрд╛рдпред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдХрджрдо рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рд╛рде рдХрдИ рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЯреЗрдХ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдВрдЯрд╛ рдПрдЬреЗрдВрдЯ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдФрд░ рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЛ рдЯреЗрдХрди рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХрдм, рдХрдм рдирд╣реАрдВред рд╡реИрд╕реЗ, рдЬрдм_ рдХреЛрдИ рднреА рд╣реЛ, рд▓реЗрдХрд┐рди рд╣рдо рдЖрдЬ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЙрдирд╕реЗ рдирд╣реАрдВ рдорд┐рд▓реЗрдВрдЧреЗред

рджреВрд╕рд░реЗ, рд╣рдореЗрдВ рдЗрд╕ рддрдереНрдп рдХреА рднреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЯреЗрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж, рдлреЛрд░реНрдХ рдПрдЬреЗрдВрдЯ рдЯреЗрдХрди рд░рд╛рдЬреНрдп рдореЗрдВ рд╣реЛрдЧрд╛ред рд╣рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ: рдкрд╣рд▓реЗ рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЬреИрд╕реЗ рд╣реА рдлреЛрд░реНрдХ рдПрдЬреЗрдВрдЯ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдорд╛рдкреНрдд рдХрд░ рд▓реЗрддрд╛ рд╣реИ, рдЙрд╕рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХрд╛ рдирд╛рдо "рдХрд╛рдВрдЯрд╛" рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдирд┐рд░реНрдорд╛рдг рдПрдЬреЗрдВрдЯ рдХреЗ рд░рд╛рдЬреНрдп рдХрд╛ рдирд╛рдо рд░рдЦрддрд╛ рд╣реИ:

 & tests::store_state_name("fork") 

рдФрд░ рдлрд┐рд░, рдЬрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рд╕рд╣реЗрдЬреЗ рдЧрдП рдирд╛рдо рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ:
 REQUIRE("taken" == sobj.scenario().stored_state_name("take_when_free", "fork")); 

рдпрд╛рдиреА рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдкреВрдЫрддреЗ рд╣реИрдВ: рд╣рдореЗрдВ рдЙрд╕ рдирд╛рдо рдХреЛ рджреЗрдВ рдЬреЛ for_ рдЯреИрдЧ рдХреЗ рд╕рд╛рде save_when_free рдирд╛рдо рдХреЗ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдорд╛рди рдХреЗ рд╕рд╛рде рдирд╛рдо рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред

рдпрд╣рд╛рдБ, рд╢рд╛рдпрдж, рд╡рд╣ рд╕рдм рд╣реИ рдЬреЛ рдХрд╛рдВрдЯрд╛ рдПрдЬреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдиреЛрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдЧрд░ рдкрд╛рдардХреЛрдВ рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рд╡рд╛рд▓ рд╣реИ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреВрдЫреЗрдВ, рд╣рдо рдЦреБрд╢реА рдХреЗ рд╕рд╛рде рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗред

рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЗ рд▓рд┐рдП рд╕рдлрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреЗрд╕реНрдЯ


рджрд╛рд░реНрд╢рдирд┐рдХ рдПрдЬреЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ - рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЬрдм рджрд╛рд░реНрд╢рдирд┐рдХ рджреЛрдиреЛрдВ рдХрд╛рдВрдЯреЗ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 TEST_CASE( "philosopher (takes both forks)" ) { tests::testing_env_t sobj{ [](so_5::environment_params_t & params) { params.message_delivery_tracer( so_5::msg_tracing::std_cout_tracer()); } }; so_5::agent_t * philosopher{}; so_5::agent_t * left_fork{}; so_5::agent_t * right_fork{}; sobj.environment().introduce_coop([&](so_5::coop_t & coop) { left_fork = coop.make_agent<fork_t>(); right_fork = coop.make_agent<fork_t>(); philosopher = coop.make_agent<philosopher_t>( "philosopher", left_fork->so_direct_mbox(), right_fork->so_direct_mbox()); }); auto scenario = sobj.scenario(); scenario.define_step("stop_thinking") .when( *philosopher & tests::reacts_to<philosopher_t::msg_stop_thinking>() & tests::store_state_name("philosopher") ) .constraints( tests::not_before(std::chrono::milliseconds(250)) ); scenario.define_step("take_left") .when( *left_fork & tests::reacts_to<msg_take>() ); scenario.define_step("left_taken") .when( *philosopher & tests::reacts_to<msg_taken>() & tests::store_state_name("philosopher") ); scenario.define_step("take_right") .when( *right_fork & tests::reacts_to<msg_take>() ); scenario.define_step("right_taken") .when( *philosopher & tests::reacts_to<msg_taken>() & tests::store_state_name("philosopher") ); scenario.define_step("stop_eating") .when( *philosopher & tests::reacts_to<philosopher_t::msg_stop_eating>() & tests::store_state_name("philosopher") ) .constraints( tests::not_before(std::chrono::milliseconds(250)) ); scenario.define_step("return_forks") .when_all( *left_fork & tests::reacts_to<msg_put>(), *right_fork & tests::reacts_to<msg_put>() ); scenario.run_for(std::chrono::seconds(1)); REQUIRE(tests::completed() == scenario.result()); REQUIRE("wait_left" == scenario.stored_state_name("stop_thinking", "philosopher")); REQUIRE("wait_right" == scenario.stored_state_name("left_taken", "philosopher")); REQUIRE("eating" == scenario.stored_state_name("right_taken", "philosopher")); REQUIRE("thinking" == scenario.stored_state_name("stop_eating", "philosopher")); } 

рдХрд╛рдлреА рдорд╛рддреНрд░рд╛ рдореЗрдВ, рд▓реЗрдХрд┐рди рддреБрдЪреНрдЫ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЬрд╛рдВрдЪ рд▓реЗрдВ рдХрд┐ рджрд╛рд░реНрд╢рдирд┐рдХ рдиреЗ рд╕реЛрдЪ рдЦрддреНрдо рдХрд░ рджреА рд╣реИ рдФрд░ рднреЛрдЬрди рдХреА рддреИрдпрд╛рд░реА рд╢реБрд░реВ рдХрд░ рджреА рд╣реИред рдлрд┐рд░ рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕рдиреЗ рдмрд╛рдПрдВ рдХрд╛рдВрдЯрд╛ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдЕрдЧрд▓рд╛, рдЙрд╕реЗ рд╕рд╣реА рдХрд╛рдВрдЯрд╛ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рдЙрд╕реЗ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред рддреЛ рд╡рд╣ рд▓рд┐рдпрд╛ рджреЛрдиреЛрдВ рдХрд╛рдВрдЯреЗ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рджреЛ рдЪреАрдЬреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рддрд░рд╣ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ_рдирд╡_ рдЯреАрдЯреА, рд▓рд┐рдкрдЯреЗ_рдирд╡_рдЯ, рдЖрдкрдХреЛ рдПрд╕рдУрдмреАрдЬреЗрд╡реА рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджреЗрд╢ рд╡рд┐рддрд░рдг рдЕрдиреБрд░реЗрдЦрдг рддрдВрддреНрд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ:

 tests::testing_env_t sobj{ [](so_5::environment_params_t & params) { params.message_delivery_tracer( so_5::msg_tracing::std_cout_tracer()); } }; 

рдпрд╣ рддрдВрддреНрд░ рдЖрдкрдХреЛ рд╕рдВрджреЗрд╢ рд╡рд┐рддрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ "рдХрд▓реНрдкрдирд╛" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдПрдЬреЗрдВрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ (рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХреА рд╣реИ )ред

рджреВрд╕рд░реЗ, рдПрдЬреЗрдВрдЯ рджрд╛рд░реНрд╢рдирд┐рдХ рддреБрд░рдВрдд рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдХреБрдЫ рд╕рдордп рдмрд╛рдж рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдЬреЗрдВрдЯ рдХреЛ рд╕реНрд╡рдпрдВ рдПрдХ рд▓рдВрдмрд┐рдд StopThinking рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред рддреЛ рдпрд╣ рд╕рдВрджреЗрд╢ рдПрдЬреЗрдВрдЯ рдХреЛ рдХреБрдЫ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрджрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рддрд┐рдмрдВрдз рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдХреЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 scenario.define_step("stop_thinking") .when( *philosopher & tests::reacts_to<philosopher_t::msg_stop_thinking>() & tests::store_state_name("philosopher") ) .constraints( tests::not_before(std::chrono::milliseconds(250)) ); 

рдпрд╛рдиреА рдпрд╣рд╛рдБ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ StopThinking рдХреЗ рд▓рд┐рдП Philosopher Agent рдХреА рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╡рд╣реА рдЬреЛ рдЗрд╕ рдЪрд░рдг рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж 250ms рд╕реЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ред

Not_before рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдмрдВрдз рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рд╕рдорд╛рдкреНрддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдлреЙрд░реНрдо рдХрд╛ рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдХреЗрд╡рд▓ рд╡реЗ рдШрдЯрдирд╛рдПрдВ рдЬреЛ рддрдм рддрдХ рд╣реЛрддреА рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реЛ, рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

Not_before рдФрд░ not_after рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 .constraints( tests::not_before(std::chrono::milliseconds(250)), tests::not_after(std::chrono::milliseconds(1250))) 

рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, SObjectizer рджрд┐рдП рдЧрдП рдореВрд▓реНрдпреЛрдВ рдХреА рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЖрдкрдиреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХреИрд╕реЗ рдХрд┐рдпрд╛?


рдореИрдВ рдХреБрдЫ рд╢рдмреНрдж рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдмрдбрд╝реЗ рдФрд░ рдмрдбрд╝реЗ, рд╣рдореЗрдВ рдПрдХ рдмрдбрд╝реЗ рд╡реИрдЪрд╛рд░рд┐рдХ рд╕рд╡рд╛рд▓ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛: "рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдПрдЬреЗрдВрдЯреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВ?" рдФрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕рд╡рд╛рд▓, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрдХрдиреАрдХреА: "рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП?"

рдФрд░ рдЕрдЧрд░ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рд╕рдВрднрд╡ рдерд╛, рддреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдереАред рдпрд╣ рдПрдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдХрд┐, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрд╕реЛрдмрд┐рдЬрд╛рдЗрдЬрд╝рд░ рдХреЗ рдЕрдВрджрд░реВрдиреА рдХреЗ рдПрдХ рдХрдЯреНрдЯрд░рдкрдВрдереА рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдФрд░, рджреВрд╕рд░реА рдмрд╛рдд, рдпрд╣ рдПрдХ рдРрд╕рд╛ рд╕рдорд╛рдзрд╛рди рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░, рдмрд╣реБрдд рд╣реА рд╡рд╛рдВрдЫрдиреАрдп, рдХрдо рд╕рдордпред

рдмрд╛рдВрд╕ рдХреЗ рдзреВрдореНрд░рдкрд╛рди рдХреА рдХрдард┐рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдХ рд╕рдорд╛рдзрд╛рди рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, SObjectizer рдХреЗ рдирд┐рдпрдорд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдирд╡рд╛рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдФрд░ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЖрдзрд╛рд░ рд╕рдВрджреЗрд╢ рд▓рд┐рдлрд╛рдлрд╛ рддрдВрддреНрд░ рд╣реИ, рдЬрд┐рд╕реЗ 5.5.23 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдмрд╛рдд рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ ред

рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдЕрдВрджрд░, рдкреНрд░рддреНрдпреЗрдХ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд▓рд┐рдлрд╛рдлреЗ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд┐рдлрд╛рдлрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдЬреЗрдВрдЯ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдПрдЬреЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рддреЛ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдЪрд▓ рдЬрд╛рддрд╛ рд╣реИред рд▓рд┐рдлрд╛рдлреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЙрди рдХреНрд╖рдгреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ "рдХрд╛рдо" рдХрд░рддреА рд╣реИред

рд▓реЗрдХрд┐рди рдХреИрд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд▓рд┐рдлрд╛рдлреЗ рдореЗрдВ SObjectizer рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрджреЗрд╢ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП?

рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╡рд╛рд▓ рдерд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛: event_queue_hook рдЬреИрд╕реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБ рд╣реИ - on_bind рдФрд░ on_unbindред

рдЬрдм рдПрдХ рдПрдЬреЗрдВрдЯ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЗрд╖рдгрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдбрд┐рд╕реНрдкреИрдЪрд░ рдПрдЬреЗрдВрдЯ рдХреЛ рдПрдХ рдШрдЯрдирд╛ Event_queue рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИред рдЗрд╕ Event_queue рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдПрдЬреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдЖрд╡рд╢реНрдпрдХ рдХрддрд╛рд░ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЬрдм рдХреЛрдИ рдПрдЬреЗрдВрдЯ SObjectizer рдХреЗ рдЕрдВрджрд░ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рдкрд╛рд╕ event_queue рдХрд╛ рд╕реВрдЪрдХ рд╣реЛрддрд╛ рд╣реИред рдЬрдм рдПрдХ рдПрдЬреЗрдВрдЯ рдХреЛ рдПрдХ SObjectizer рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рд╕реВрдЪрдХ рдХреЛ event_queue рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╕рдВрд╕реНрдХрд░рдг 5.5.24 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдПрдЬреЗрдВрдЯ, Event_queue рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░, event_queue_hook рдХреЗ on_bind рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрд╣рд╛рдВ рдПрдЬреЗрдВрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд рд╕реВрдЪрдХ рдХреЛ event_queue рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ event_queue_hook рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдпрд╛ рддреЛ рдЙрд╕реА рдкреЙрдЗрдВрдЯрд░ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдПрдЬреЗрдВрдЯ рдХреЛ рджрд┐рдП рдЧрдП рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрдм рдХрд┐рд╕реА рдПрдЬреЗрдВрдЯ рдХреЛ SObjectizer рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ event_queue_hook рдкрд░ on_unbind рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред On_unbind рдореЗрдВ, рдПрдЬреЗрдВрдЯ рдЙрд╕ рдорд╛рди рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдЬреЛ on_bind рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣ рдкреВрд░реА рд░рд╕реЛрдИ SObjectizer рдХреЗ рдЕрдВрджрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕рдореЗрдВ рд╕реЗ рдХреБрдЫ рднреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдФрд░, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди SObjectizer рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рд╡реЗрд╢, рд╕рдорд╛рди рдЯреЗрд╕реНрдЯрд┐рдВрдЧ_env_t, рдмрд┐рд▓реНрдХреБрд▓ event_queue_hook рдХрд╛ рд╢реЛрд╖рдг рдХрд░рддрд╛ рд╣реИред рдЯреЗрд╕реНрдЯрд┐рдВрдЧ_рдиреЗрд╡_ рдХреЗ рдЕрдВрджрд░, event_queue_hook рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредOn_bind рдореЗрдВ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рддреНрдпреЗрдХ рдИрд╡реЗрдВрдЯ_queue рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░реЙрдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реИред рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рдкреНрд░реЙрдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдЬреЗрдВрдЯ рдХреЛ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд▓рд┐рдлрд╛рдлреЗ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИредрдЖрдкрдХреЛ рдпрд╛рдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рдПрдЬреЗрдВрдЯреЛрдВ рдХреЛ рдЬрдореЗ рд╣реБрдП рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдЫрджреНрдо рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдмрдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рдЪрд▓ рд░рд╣реА рд╣реИ, рдкреНрд░реЙрдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдШрд░ рдкрд░ рдПрдЬреЗрдВрдЯ рдХреЛ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдИ рдЬрд╛рддреА рд╣реИ, рддреЛ рдкреНрд░реЙрдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдЬреЗрдВрдЯ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрджреЗрд╢ рдХрддрд╛рд░ рдореЗрдВ рд╕рднреА рдкрд╣рд▓реЗ рд╕рдВрдЪрд┐рдд рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЕрдВрдд рдореЗрдВ, рдореИрдВ рджреЛ рдмрд╛рддреЗрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдХрд┐ рдХреИрд╕реЗ рдПрдЬреЗрдВрдЯреЛрдВ рдХреЛ SObjectizer рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░реА рд░рд╛рдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрд╕рдкрд╛рд╕ рдЗрддрдиреЗ рдЕрдЪреНрдЫреЗ рд░реЛрд▓ рдореЙрдбрд▓ рдирд╣реАрдВ рд╣реИрдВред рд╣рдордиреЗ рдЕрдХреНрдХрд╛ рдХреА рдУрд░ рджреЗрдЦрд╛ ред рд▓реЗрдХрд┐рди рдЕрдХреНрдХрд╛ рдФрд░ рд╕реЛрдмрд┐рдЬрд╛рдЗрдЬрд╝рд░ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВ рдЬреЛ рдЕрдХреНрдХрд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ C ++ Scala / Java рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рдЪреАрдЬреЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЖрдирд╛ рдкрдбрд╝рд╛ рдЬреЛ рдХрд┐ рдПрд╕рдУрдмреАрдЬреЗрдирд╛рдЗрдЬрд╝рд░ рдкрд░ рдкрдбрд╝рддрд╛ рд╣реИред

5.5.24 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдмрд╣реБрдд рдкрд╣рд▓реЗ, рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЧрдпрд╛ред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдк рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреИрд╕реЗ рд╕рдордЭреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдФрд░ рдХреНрдпрд╛ рдмреЗрдХрд╛рд░ рдХрд▓реНрдкрдирд╛рдПрдВ рд╣реИрдВ? рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХреБрдЫ рднреА рдирд╣реАрдВред рдЖрдкрдХреЛ рд▓реЗрдиреЗ рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рджреЗрдЦреЗрдВ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдПрдХ рдиреНрдпреВрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдпрд╛, рдЬрд┐рд╕реЗ рдЖрдк рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдЬрдорд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рд╕рднреА рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ: рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рдЫрд╛рдкреЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред рдЖрдкрдХреЛ рдХреНрдпрд╛ рдкрд╕рдВрдж рдЖрдпрд╛, рдЖрдкрдХреЛ рдХреНрдпрд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдпрд╛? рд╢рд╛рдпрдж рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ?

рджреВрд╕рд░реЗ, 2017 рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣реЗ рдЧрдП рд╢рдмреНрдж рдФрд░ рднреА рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рдЧрдП :
тАж , , , . - тАФ . . . : , .

, , , тАФ , .

рдЗрд╕рд▓рд┐рдП, рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рд╕рд▓рд╛рд╣ рдЬреЛ рдПрдХ рддреИрдпрд╛рд░ рдЕрднрд┐рдиреЗрддрд╛ рдврд╛рдВрдЪреЗ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: рди рдХреЗрд╡рд▓ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдореМрд▓рд┐рдХрддрд╛ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рд╕реБрдВрджрд░рддрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╣рд╛рдпрдХ рдЪреАрдЬреЛрдВ рдХреЛ рднреА рджреЗрдЦреЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреА рдХрд┐ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдХрд┐рддрдиреЗ рдХрд▓рд╛рдХрд╛рд░ рдЕрднреА рдЕрдВрджрд░ рд╣реИрдВ, рдЙрдирдХреА рдХрддрд╛рд░ рдХреЗ рдЖрдХрд╛рд░ рдХреНрдпрд╛ рд╣реИрдВ, рдпрджрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд╣рд╛рдВ рдЬрд╛рддрд╛ рд╣реИ ... рдпрджрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд░рддрд╛ рд╣реИ рдРрд╕рд╛ рдХреБрдЫ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдзрд┐рдХ рдХрд╛рдо рд╣реЛрдЧрд╛ред
рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдФрд░ рднреА рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрдм рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рдЕрднрд┐рдиреЗрддрд╛ рдврд╛рдВрдЪрд╛ рдЪреБрдирддреЗ рд╣реИрдВ, рддреЛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рдЯреВрд▓рдХрд┐рдЯ рдореЗрдВ рд╣реИ :)

Source: https://habr.com/ru/post/hi435606/


All Articles