SObjectizer  5.1
so_5/disp

main.cpp

/*
Пример работы с диспетчерами.
*/
#include <iostream>
#include <sstream>
#include <ace/OS.h>
#include <ace/Log_Msg.h>
// Загружаем основные заголовочные файлы SObjectizer.
#include <so_5/rt/h/rt.hpp>
// Диспетчеры.
// C++ описание класса агента.
class a_disp_user_t
:
{
typedef so_5::rt::agent_t base_type_t;
public:
a_disp_user_t(
const std::string & name )
:
base_type_t( env ),
m_name( name )
{}
virtual ~a_disp_user_t()
{}
// Обработка начала работы агента в системе.
virtual void
// Обработка завершения работы агента в системе.
virtual void
private:
const std::string m_name;
};
// Макрос для формата сообщений, выводимых с помощью ACE logging.
#define AGENT_MSG( s ) "TID:%t %T " s
void
a_disp_user_t::so_evt_start()
{
ACE_DEBUG(( LM_INFO,
AGENT_MSG( "%s.so_evt_start(): start pause\n" ), m_name.c_str() ));
// Засыпаем на одну секунду
ACE_OS::sleep( 1 );
ACE_DEBUG(( LM_INFO,
AGENT_MSG( "%s.so_evt_start(): finish pause\n" ), m_name.c_str() ));
}
void
a_disp_user_t::so_evt_finish()
{
ACE_DEBUG(( LM_INFO,
AGENT_MSG( "%s.so_evt_finish(): start pause\n" ), m_name.c_str() ));
// Засыпаем на одну секунду
ACE_OS::sleep( 1 );
ACE_DEBUG(( LM_INFO,
AGENT_MSG( "%s.so_evt_finish(): finish pause\n" ), m_name.c_str() ));
}
// Создать имя агента.
std::string
create_agent_name( const std::string & base, int i )
{
std::ostringstream sout;
sout << base << "_" << i;
return sout.str();
}
// Инициализация окружения
void
{
// Создаем кооперацию.
// Добавляем в кооперацию агентов, которые будут работать
// с диспетчером SObjectizer по умолчанию.
for( int i = 0; i < 4; ++i )
{
const std::string name = create_agent_name( "default_disp", i+1 );
coop->add_agent(
new a_disp_user_t( env, name ) ) );
}
// Добавляем в кооперацию агентов, которые будут работать
// с диспетчером single_thread.
for( int i = 0; i < 3; ++i )
{
const std::string name = create_agent_name( "single_thread", i+1 );
coop->add_agent(
so_5::rt::agent_ref_t( new a_disp_user_t( env, name ) ),
"single_thread" ) );
}
// Добавляем в кооперацию агентов, которые будут работать
// с диспетчером active_group в группе A.
for( int i = 0; i < 2; ++i )
{
const std::string name = create_agent_name( "active_group_A", i+1 );
coop->add_agent(
so_5::rt::agent_ref_t( new a_disp_user_t( env, name ) ),
"active_group",
"A" ) );
}
// Добавляем в кооперацию агентов, которые будут работать
// с диспетчером active_group в группе B.
for( int i = 0; i < 2; ++i )
{
const std::string name = create_agent_name( "active_group_B", i+1 );
coop->add_agent(
so_5::rt::agent_ref_t( new a_disp_user_t( env, name ) ),
"active_group",
"B" ) );
}
// Добавляем в кооперацию агентов, которые будут работать
// с диспетчером active_object.
for( int i = 0; i < 4; ++i )
{
const std::string name = create_agent_name( "active_obj", i+1 );
coop->add_agent(
so_5::rt::agent_ref_t( new a_disp_user_t( env, name ) ),
"active_obj" ) );
}
// Регистрируем кооперацию.
env.register_coop( std::move( coop ) );
// Инициируем завершение.
env.stop();
}
int
main( int, char ** argv )
{
ACE_LOG_MSG->open (argv[0], ACE_Log_Msg::STDERR);
try
{
&init,
.add_named_dispatcher(
so_5::rt::nonempty_name_t( "single_thread" ),
.add_named_dispatcher(
so_5::rt::nonempty_name_t( "active_group" ),
.add_named_dispatcher(
so_5::rt::nonempty_name_t( "active_obj" ),
}
catch( const std::exception & ex )
{
std::cerr << "Error: " << ex.what() << std::endl;
return 1;
}
return 0;
}

Документация по SObjectizer v.5.1 'Джимара'. Последние изменения: Ср 15 Май 2013 12:56:18. Создано системой  doxygen1.8.3.1 Intervale SourceForge.net Logo