Compartilhar via


Otimizando persistência e inicialização

Por padrão, a inicialização em um controle e persistência são manipuladas pelo DoPropExchange função de membro.Em um controle comum, esta função contém chamadas a vários PX_ funções (PX_Color, PX_Fonte assim por diante), um para cada propriedade.

Essa abordagem tem a vantagem que um único DoPropExchange implementação pode ser usada para inicialização, persistência em formato binário e persistência no formato saco-chamados"propriedade" usado por alguns recipientes.Essa uma função fornece todas as informações sobre as propriedades e seus valores padrão em um local conveniente.

No entanto, esta generalidade vem à custa da eficiência.O PX_ funções obtém sua flexibilidade por meio de implementações de várias camadas que são inerentemente menos eficiente do que as abordagens mais diretas, mas menos flexíveis.Além disso, se um controle passa um valor padrão para um PX_ função, que um valor padrão deve ser fornecido sempre, mesmo em situações quando o valor padrão necessariamente não pode ser usado.Se gerar o valor padrão é uma tarefa não trivial (por exemplo, quando o valor é obtido de uma propriedade de ambiente), em seguida, extra, trabalho desnecessário é feito em casos onde o valor padrão não é usado.

Você pode melhorar o desempenho de persistência binário do controle, substituindo o controle Serialize função.A implementação padrão desta função de membro faz uma chamada para seu DoPropExchange função.Substituindo ele, você pode fornecer uma implementação mais direta para persistência binária.Por exemplo, considere esta DoPropExchange função:

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 melhorar o desempenho de persistência binário do controle, você pode substituir o Serialize funciona da seguinte maneira:

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

O dwVersion variável local pode ser usada para detectar a versão do estado persistente do controle que está sendo carregada ou salvo.Você pode usar essa variável em vez de chamada CPropExchange::GetVersion.

Para salvar um pouco de espaço no formato persistente para um BOOL propriedade (e mantê-lo compatível com o formato produzido por PX_Bool), você pode armazenar a propriedade como um bytes, da seguinte forma:

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

Observe que, no caso de carga, uma variável temporária é usada e, em seguida, seu valor é atribuído, em vez de projeção m_boolProp para um bytes referência.A técnica de projeção resultaria em apenas um byte de m_boolProp sendo modificado, deixando os bytes restantes não inicializados.

Para o mesmo controle, você pode otimizar a inicialização do controle substituindo COleControl::OnResetState da seguinte maneira:

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

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

Embora Serialize e OnResetState foi substituído, o DoPropExchange função deve ser mantida intacta porque ainda é usado para persistência no formato do conjunto de propriedades.É importante manter todas as três dessas funções para garantir o controle gerencia suas propriedades de forma consistente, independentemente de qual persistência mecanismo o contêiner usa.

Consulte também

Conceitos

Controles de ActiveX MFC: otimização