Есть иерархия классов логирования на С++
class ICustomEvent;
class EventManager;
// call
{
EventManager::Instance()->AddEvent( new ICustomEvent( /* params */ ) );
}
По поводу не использовать велосипед просьба не писать.
Проблема такая, что мне необходимо засекать время выполнения кода. По большому счету — выполнение кода текущего стека
{
EventManager::Instance()->AddEvent( new ICustomEvent( /* params */ ) ); // start timer
// code
} // stop timer
Не могу придумать, как можно удобно сделать этот самый класс таймера.
хочется:
1. создавать объект на стеке, который в конструкторе засекает, в деструкторе сохраняет значение в событие
2. писать все не более, чем в 1 строчку.
Вариант сейчас такой созрел: написать декоратор для событий, который будет иметь 2 доп. метода: старт/стоп
Создать класс, который будет получать ссылку на декоратор, создаваться на стеке, и выставлять все параметры. но это много и как-то некрасиво.
Здравствуйте, sax0n, Вы писали:
S>1. создавать объект на стеке, который в конструкторе засекает, в деструкторе сохраняет значение в событие
S>2. писать все не более, чем в 1 строчку.
boost.timer
S>По поводу не использовать велосипед просьба не писать.
Скопируй себе и переименуй идентификаторы. После этого можно считать что это свой велосипед.
Здравствуйте, ShubinEV, Вы писали:
SEV>Здравствуйте, sax0n, Вы писали:
S>>1. создавать объект на стеке, который в конструкторе засекает, в деструкторе сохраняет значение в событие
S>>2. писать все не более, чем в 1 строчку.
SEV>boost.timer
S>>По поводу не использовать велосипед просьба не писать.
SEV>Скопируй себе и переименуй идентификаторы. После этого можно считать что это свой велосипед.
Ха. У меня не стоит проблема написать сам таймер (за boost::timer спасибо).
Проблема, как лучше связать событие с таймером, чтобы это было просто в использовании.
Сейчас вариант такой (это больше схематическое представление.):
/// Интерфейс, базовый для любого события
class ICustomEvent: public IInterface
{
/* .. */
};
/// Декоратор для любого события
/// принимает аргументом интерфейс таймера, который в деструкторе выставит значения в событие
class TimerDecorator: public ICustomEvent
{
public:
TimerDecorator( ICustomEvent *pEvent, ITimer &timer )
m_pEvent( pEvent )
{
timer.SetDest( this );
}
void SetStartTime();
void SetFinishTime();
};
class ITimer
{
public:
ITimer()
{
m_start = timerStart;
}
~ITimer()
{
if ( m_pDecorator ){ m_pDecorator->SetStartTime(); m_pDecorator->SetFinishTime(); }
}
void SetDest( TimerDecorator *pTimerDecorator ){ m_pDecroator = pTimerDecorator; }
private:
TimerDecorator *m_pDecorator;
};
/// Использование
{
ITimer timer;
Manager()->AddEvent( new TimerDecorator( new ICustomEvent(), timer ) );
// some code
}
В принципе, по использованию оно подходит. Но не нравится эта связь декоратор-таймер. Что, если вдруг декоратор будет уничтожен раньше.