Partager via


Optimiser la persistance et l'initialisation

Par défaut, la persistance et l'initialisation d'un contrôle sont traitées par la fonction membre d' DoPropExchange .Dans un contrôle classique, cette fonction contient les appels à plusieurs fonctions de PX_ (PX_Color, PX_Font, etc.), un pour chaque propriété.

Cette approche présente l'avantage que l'implémentation unique d' DoPropExchange peut être utilisée pour l'initialisation, pour la persistance au format binaire, et pour la persistance dans le appelées format « sac de propriétés » utilisé par certains conteneurs.Cette fonction fournit toutes les informations sur les propriétés et leurs valeurs par défaut dans un emplacement commode.

Toutefois, cette généralité provient au détriment de l'efficacité.Les fonctions de PX_ obtiennent leur souplesse via les implémentations multicouche qui sont fondamentalement moins efficaces que plus directs, mais moins les flexibles, approches.En outre, si un contrôle passe une valeur par défaut à une fonction de PX_ , cette valeur par défaut doit être fournie à chaque fois, même dans des situations où la valeur par défaut ne peut nécessairement être utilisée.Si générer la valeur par défaut est une tâche non triviale (par exemple, lorsque la valeur est obtenue d'une propriété ambiante), les un supplémentaire, travail inutile sont apportées dans les cas où la valeur par défaut n'est pas utilisée.

Vous pouvez améliorer la représentation binaire de la persistance de votre contrôle en substituant la fonction d' Serialize de votre contrôle.L'implémentation par défaut de cette fonction membre effectue un appel à la fonction d' DoPropExchange .En substituant, vous pouvez fournir une implémentation plus directe pour la persistance binaire.Par exemple, considérez cette fonction d' 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(""));
}

Pour améliorer les performances de la persistance binaire de ce contrôle, vous pouvez substituer la fonction d' Serialize comme suit :

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 locale d' dwVersion peut être utilisée pour détecter la version de l'état de persistance du contrôle est chargé ou enregistré.Vous pouvez utiliser cette variable au lieu d'appeler CPropExchange::GetVersion.

Pour enregistrer une petite quantité d'espace dans le format persistant pour une propriété de BOOL (et pour la maintenir compatible avec le format produit par PX_Bool), vous pouvez enregistrer la propriété comme BYTE, comme suit :

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

Notez que dans le cas de charge, une variable temporaire est utilisé puis sa valeur est assignée, plutôt qu' m_boolProp de cast vers une référence de BYTE .La technique de casting entraînerait un seul octet d' m_boolProp modifié, en laissant les octets restants non initialisés.

Pour le même contrôle, vous pouvez optimiser l'initialisation du contrôle en substituant COleControl::OnResetState comme suit :

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

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

Bien qu' Serialize et OnResetState ont été substitués, la fonction d' DoPropExchange doit être conservée intacte car elle est encore utilisée pour la persistance au format de conteneur de propriétés.Il est important que les trois de ces fonctions pour garantir que le contrôle gère ses propriétés régulièrement, quel que soit le mécanisme de persistance le conteneur utilise.

Voir aussi

Concepts

Contrôles ActiveX MFC : optimisation