Sdílet prostřednictvím


Optimalizace trvalosti a inicializace

Ve výchozím nastavení, perzistence a inicializace ovládacího prvku jsou zpracována DoPropExchange členské funkce.V typické ovládací prvek, tato funkce obsahuje několik volání PX_ funkce (PX_Color, PX_Fonta tak dále), jeden pro každou vlastnost.

Tento postup má tu výhodu, že jeden DoPropExchange provedení lze použít pro inicializaci, perzistence v binárním formátu a perzistence v takzvané "vlastnost vaku pro jímání" formát použitý v některých nádobách.Tato funkce poskytuje všechny informace o vlastnostech a jejich výchozí hodnoty v jednom vhodném umístění.

Toto obecné však dodává na úkor účinnosti.PX_ funkce získat jejich flexibilitu prostřednictvím implementace s více vrstvami, které jsou ze své podstaty méně efektivní než přímější, ale méně flexibilní přístupy.Navíc pokud ovládací prvek projde výchozí hodnotu PX_ fungovat, že výchozí hodnota je nutné zadat pokaždé, i v situacích, když nemusí být použita výchozí hodnota.Je-li výchozí hodnotu pro generování jednoduché úlohy (například pokud je hodnota získána z okolí vlastnosti) a potom extra, zbytečné práce se provádí v případech, kdy není použita výchozí hodnota.

Můžete zlepšit výkon binární přetrvávání ovládacího prvku ovládacího prvku překrytím Serialize funkce.Výchozí implementace této členské funkce zavolá vaše DoPropExchange funkce.Přepsáním ho zadáte přímější implementaci pro binární perzistence.Zvažte například tento DoPropExchange funkce:

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

Chcete-li zvýšit výkon binární přetrvávání tohoto ovládacího prvku, můžete přepsat Serialize fungovat takto:

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

dwVersion Místní proměnné lze použít ke zjištění verze ovládacího prvku trvalý stav Probíhá načtení či uložení.Tuto proměnnou můžete použít namísto volání metody CPropExchange::GetVersion.

V trvalém formátu pro uložení trochu místa BOOL vlastnost (, která bude kompatibilní s formátem vyrobené PX_Bool), můžete uložit vlastnost jako BAJT, 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žívá dočasnou proměnnou a pak jeho hodnota je přiřazena, spíše než obsazení m_boolProp k BAJT odkaz.Lití technika by měla za následek pouze jeden bajt m_boolProp upravován, ponechat zbývajících bajtů inicializovat.

Pro stejný ovládací prvek, můžete optimalizovat inicializace ovládacího prvku překrytím COleControl::OnResetState takto:

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 byla přepsána, DoPropExchange funkce by měly být neustále beze změny vzhledem k tomu, že je stále používán pro přetrvání balík vlastností formát.Je důležité udržovat všechny tři tyto funkce zajistit ovládací prvek jednotně, spravuje jeho vlastnosti, bez ohledu na to, které přetrvávání mechanismus kontejner používá.

Viz také

Koncepty

MFC – ovládací prvky ActiveX: Optimalizace