Sdílet prostřednictvím


Optimalizace trvalosti a inicializace

Ve výchozím nastavení se trvalost a inicializace v ovládacím prvku zpracovávají DoPropExchange členské funkce. V typickém ovládacím prvku tato funkce obsahuje volání několika PX_ funkcí (PX_ColorPX_Fontatd.), jedna pro každou vlastnost.

Tento přístup má výhodu, že jednu DoPropExchange implementaci lze použít pro inicializaci, trvalost v binárním formátu a trvalost v tzv. "property-bag" formátu používaném některými kontejnery. Tato funkce poskytuje všechny informace o vlastnostech a jejich výchozích hodnotách na jednom vhodném místě.

Tato generalita ale vychází z hlediska efektivity. Funkce PX_ získají flexibilitu prostřednictvím vícevrstevných implementací, které jsou ze své podstaty méně efektivní než přímé, ale méně flexibilní přístupy. Pokud navíc ovládací prvek předá výchozí hodnotu funkci PX_ , musí být tato výchozí hodnota zadána pokaždé, i v situacích, kdy nemusí být výchozí hodnota nutně použita. Pokud je vygenerováním výchozí hodnoty netriviální úkol (například když je hodnota získána z okolní vlastnosti), pak se nadbytečná práce provádí v případech, kdy se výchozí hodnota nepoužívá.

Výkon binární trvalosti ovládacího prvku můžete zlepšit přepsáním funkce ovládacího prvku Serialize . Výchozí implementace této členské funkce volá vaši DoPropExchange funkci. Přepsáním můžete poskytnout přímou implementaci binární trvalosti. Představte si například tuto DoPropExchange funkci:

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(""));
}

Pokud chcete zvýšit výkon binární trvalosti tohoto ovládacího prvku, můžete funkci přepsat Serialize následujícím způsobem:

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

Místní dwVersion proměnnou lze použít ke zjištění verze trvalého stavu ovládacího prvku, který se načítá nebo ukládá. Tuto proměnnou můžete použít místo volání CPropExchange::GetVersion.

Pokud chcete ušetřit trochu místa v trvalém formátu pro vlastnost BOOL (a zachovat ji kompatibilní s formátem vytvořeným PX_Bool), můžete tuto vlastnost uložit jako BYTE takto:

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

Všimněte si, že v případě zatížení se použije dočasná proměnná a její hodnota se přiřadí, nikoli přetypování m_boolProp na odkaz BYTE . Technika přetypování by způsobila, že se upraví pouze jeden bajt m_boolProp , přičemž zbývající bajty nebudou inicializovány.

Pro stejný ovládací prvek můžete optimalizovat inicializaci ovládacího prvku přepsáním COleControl::OnResetState následujícím způsobem:

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

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

I když Serialize a OnResetState byly přepsány, funkce by měla být zachována beze změny, DoPropExchange protože se stále používá pro trvalost ve formátu kontejneru vlastností. Je důležité udržovat všechny tři z těchto funkcí, aby ovládací prvek spravovala jeho vlastnosti konzistentně bez ohledu na to, který mechanismus trvalosti kontejner používá.

Viz také

MFC – ovládací prvky ActiveX: Optimalizace