Compartilhar via


Otimizando persistência e inicialização

Por padrão, a persistência e a inicialização em um controle são tratadas pela função de membro de DoPropExchange . Em um controle típico, essa função contém as chamadas para várias funções de PX_ (PX_Color, PX_Font, e assim por diante), um para cada propriedade.

Esse método tem a vantagem de que uma única implementação de DoPropExchange pode ser usada para inicialização, para a persistência em formato binário, e para a persistência no formato também chamado de “-” catchall usado por qualquer contêiner. Essa função fornece todas as informações sobre as propriedades e seus valores padrão em um local conveniente.

No entanto, essa generalidade vem às custas da eficiência. As funções de PX_ obtém a flexibilidade com as implementações multicamadas que são inerentemente menos eficientes do que mais diretos, mas as abordagens menos flexíveis. Além disso, se um controle passa um valor padrão a uma função de PX_ , esse valor padrão deve ser fornecido o tempo todo, mesmo em situações quando o valor padrão não necessariamente ser usado. Se gerar o valor padrão é uma tarefa nontrivial (por exemplo, quando o valor é obtido de uma propriedade de ambiente), o acréscimo, trabalho desnecessário é feita nos casos em que o valor padrão não é usado.

Você pode melhorar o desempenho binário de persistência do controle substituindo a função de Serialize do controle. A implementação padrão dessa função de membro faz uma chamada à função de DoPropExchange . Substituindo a, você pode fornecer uma implementação mais direta para a persistência binário. Por exemplo, considere esta função 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 melhorar o desempenho de persistência binária deste controle, você pode substituir a função de Serialize como segue:

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

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

Para salvar pouco espaço no formato persistente para uma propriedade de BOOL (e para manter compatíveis com o formato gerado por PX_Bool), você pode armazenar a propriedade como BYTE, como segue:

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

Observe que nos exemplos de carga, uma variável temporário é usado e seu valor é então atribuído, em vez de convertendo m_boolProp a uma referência de BYTE . A técnica de conversão resultaria em apenas um byte de m_boolProp que está sendo alterado, deixando os bytes restantes não inicializado.

Para o mesmo controle, você pode otimizar a inicialização de controle substituindo COleControl::OnResetState como segue:

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 sejam substituídos, a função de DoPropExchange deve ser mantida intacto porque ainda é usada para a persistência no formato do com conjunto. É importante manter todas essas três funções para assegurar que o controle gerencia suas propriedades forma consistente, independentemente do mecanismo de persistência o contêiner usa.

Consulte também

Conceitos

Controles ActiveX MFC: otimização