Поделиться через


Оптимизировать сохраняемости и инициализация

По умолчанию сохраняемость и инициализация в элементе управления обрабатывается функцией-членом DoPropExchange.В стандартном элементе управления, эта функция содержит вызовы функций с несколькими PX_ (PX_Color, PX_Font и т д), по одному для каждого свойства.

Данный подход имеет то преимущество, что одну реализацию DoPropExchange может быть использован для инициализации для сохранения в бинарном формате и для сохранения в формате контейнера называемом «свойства», используемом некоторыми контейнерами.Эта одна функция предоставляет все сведения о свойствах и их значения по умолчанию в удобном месте.

Однако эта обычность поступает за показатель эффективности.Функции PX_ получающих гибкость до многослойные реализации, по существу менее эффективны, чем более гибкие напрямую, но менее, подходы.Кроме того, если элемент управления передает значение по умолчанию функции PX_, то значение по умолчанию должно быть предоставлено каждый раз, даже в тех случаях, когда значение по умолчанию не обязательно должен использоваться.Если формирование значение по умолчанию нетривиальная задача (например, когда значение получено из внешнего свойства), то дополнительного, ненужный исполнитель выполняется в тех случаях, когда значение по умолчанию не используется.

Можно улучшить производительность сохранения элемента управления бинарную путем переопределения функция Serialize элемента управления.Реализация по умолчанию данного функции-члена осуществляет вызовы функции DoPropExchange.Путем переопределения, можно предоставить более непосредственно реализацию бинарной сохраняемости.Например, рассмотрим следующую функцию DoPropExchange:

void CMyAxOptCtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);

   PX_Bool(pPX, _T("BoolProp"), m_BoolProp, TRUE);
   PX_Short(pPX, _T("ShortProp"), m_ShortProp, 0);
   PX_Color(pPX, _T("ColorProp"), m_ColorProp, RGB(0xFF,0x00,0x00));
   PX_String(pPX, _T("StringProp"), m_StringProp, _T(""));
}

Чтобы повысить производительность сохранения данного элемента управления бинарной можно переопределить функцию Serialize следующим образом:

void CMyAxOptCtrl::Serialize(CArchive& ar)
{ 
    SerializeVersion(ar, MAKELONG(_wVerMinor, _wVerMajor));
    SerializeExtent(ar);
    SerializeStockProps(ar);

    if (ar.IsLoading())
    {
        ar >> m_BoolProp;
        ar >> m_ShortProp;
        ar >> m_ColorProp;
        ar >> m_StringProp;
    }
    else
    {
        ar << m_BoolProp;
        ar << m_ShortProp;
        ar << m_ColorProp;
        ar << m_StringProp;
    }
}

Локальную переменную dwVersion можно использовать для обнаружения версия сохраненного состояния элемента управления постоянного или нагружанной.Можно использовать эту переменную вместо вызова CPropExchange::GetVersion.

Чтобы сохранить меньшюю пространство в постоянном формате для свойства BOOL (и сохранить его совместимым с формат, созданный PX_Bool) можно хранить свойство как byte следующим образом:

if (ar.IsLoading())
{
   BYTE bTmp;
   ar >> bTmp;
   m_BoolProp = (BOOL)bTmp;
   // other properties...
}
else
{
   ar << (BYTE)m_BoolProp;
   // other properties...
}

Обратите внимание, что в грузовом контейнере, используется временная переменная, а затем значение, присвоенное m_boolProp, а не приводит к ссылке byte.Метод приведения привело бы к только в одном байте, дорабатыванным m_boolProp, а оставшиеся байты неинициализированным.

Для одного элемента управления, можно оптимизировать инициализация элемента управления путем переопределения COleControl::OnResetState следующим образом:

void CMyAxOptCtrl::OnResetState()
{
   ResetVersion(MAKELONG(_wVerMinor, _wVerMajor));
   ResetStockProps();

   m_BoolProp = TRUE;
   m_ShortProp = 0;
   m_ColorProp = RGB(0xFF,0x00,0x00);
   m_StringProp.Empty();
}

Хотя Serialize и OnResetState были переопределены, функция DoPropExchange должна быть сохранена останутся неизменными, поскольку она по-прежнему используется для сохранения в формате контейнера свойств.Важно поддерживать все 3 из этих функций, чтобы убедиться, что элемент управления управляет его свойства согласованно, независимо от которых механизм сохраняемости используют контейнер.

См. также

Основные понятия

Элементы управления ActiveX MFC: оптимизация