Compartir a través de


Optimizar Persistence y la inicialización

De forma predeterminada, la persistencia y la inicialización de un control se controlan mediante la función miembro de DoPropExchange .En un control típico, esta función contiene las llamadas a las funciones de PX_ (PX_Color, PX_Font, etc.), una para cada propiedad.

Este enfoque tiene la ventaja de que una implementación única de DoPropExchange se puede utilizar para la inicialización, para la persistencia en formato binario, y para la persistencia en el supuesto formato “contenedor de propiedades” utilizado por algunos contenedores.Esta función proporciona toda la información sobre las propiedades y sus valores predeterminados en un lugar apropiado.

Sin embargo, esta generalidad llega a expensas de la eficacia.Las funciones de PX_ obtiene su flexibilidad con las implementaciones de varias capas que inherentemente menos eficaces que más directos, pero el menos flexibles, enfoques.Además, si un control pasa un valor predeterminado a una función de PX_ , ese valor predeterminado se debe proporcionar cada vez, incluso en situaciones en las que el valor no se puede utilizar necesariamente.Si se genera el valor predeterminado es una tarea no trivial (por ejemplo, cuando se obtiene el valor de una propiedad de ambiente), el complemento, trabajo innecesario se realiza en caso de que el valor no se utiliza.

Puede mejorar el rendimiento binario de persistencia de su control reemplazando la función de Serialize del control.La implementación predeterminada de esta función miembro realiza una llamada a la función de DoPropExchange .Invalidandola, puede proporcionar una implementación más sencilla para persistencia binaria.Por ejemplo, considere esta función de 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(""));
}

Para mejorar el rendimiento de persistencia binaria de este control, puede reemplazar la función de Serialize como sigue:

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;
    }
}

La variable local de dwVersion se puede utilizar para detectar la versión de estado persistente de control cargada o guardada.Puede utilizar esta variable en lugar de llamar a CPropExchange::GetVersion.

Para guardar un poco espacio en el formato persistente para una propiedad de BOOL (y mantenerla compatible con el formato generado por PX_Bool), puede almacenar la propiedad como BYTE, como sigue:

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

Observe que en el caso de carga, una variable temporal se utiliza a continuación el valor asignado, en lugar de m_boolProp de inicio a una referencia de BYTE .La técnica de fotograma produciría un byte de m_boolProp que se ha modificado, ya que los bytes restantes desinicializó.

Para el mismo control, puede optimizar la inicialización de control reemplazando COleControl::OnResetState como sigue:

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

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

Aunque Serialize y OnResetState han reemplazado, la función de DoPropExchange se debe mantener intacta porque todavía se utiliza para la persistencia en el formato del contenedor de propiedades.Es importante mantener los tres de estas funciones para asegurarse de que el control administra sus propiedades de forma coherente, independientemente de las que el mecanismo de persistencia el contenedor utiliza.

Vea también

Conceptos

Controles ActiveX de MFC: optimización