Optimieren von Persistenz und Initialisierung

Standardmäßig werden und Dauerhaftigkeit Initialisierung in einem Steuerelement durch die DoPropExchange-Memberfunktion. In einem typischen Steuerelement enthält diese Funktion werden Aufrufe an einige PX_-Funktionen (PX_Color, PX_Font, z.), einen für jede Eigenschaft.

Dieser Ansatz hat den Vorteil, dass eine einzelne DoPropExchange Implementierung zur Initialisierung, zur Beibehaltung im Binärformat und zur Beibehaltung im so genannten "Eigenschaftensammlungs" Format verwendet werden kann, das durch mehrere Container verwendet wird. Diese eine Funktion bietet alle Informationen über die Eigenschaften und deren Standardwerte in einem geeigneten Ort.

Allerdings enthält dieses Allgemeine auf Kosten von Effizienz. Die PX_-Funktionen rufen ihre Flexibilität von mehrschichtige Implementierungen, die naturgemäß weniger effizient als mehr direkt sind, das weniger flexible, Ansätze ab. Wenn ein Steuerelement einen Standardwert zu PX_ eine Funktion übergeben wird, muss dieser Standardwert, sogar in Situationen jedes Mal bereitgestellt werden, wenn der Standardwert möglicherweise nicht notwendigerweise verwendet wird. Wenn, den Standardwert zu generieren eine nicht-triviale Aufgabe wird (beispielsweise, wenn der Wert einer Ambient-Eigenschaft abgerufen wurde), dann sind zusätzliche, unnötige Arbeit ausgeführt, wenn der Standardwert nicht verwendet wird.

Sie können Persistenzleistung des Steuerelements verbessern binäre, indem Sie Serialize-Funktion des Steuerelements überschreiben. Die Standardimplementierung dieser Memberfunktion macht einen Aufruf der Funktion DoPropExchange. Durch sie überschreiben, können Sie eine direktere Implementierung für die Beibehaltung bereitstellen. Angenommen diese DoPropExchange-Funktion:

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

Um die Leistung der binären Dauerhaftigkeit dieses Steuerelements zu verbessern, können Sie die Serialize-Funktion überschreiben wie folgt:

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

Die lokale Variable dwVersion kann verwendet werden, um die Version des dauerhaften Zustands geladen oder gespeicherten des Steuerelements zu erkennen. Sie können diese Variable verwenden, anstatt, CPropExchange::GetVersion aufzurufen.

Um ein wenig Platz im persistenten Format für eine BOOL-Eigenschaft zu speichern (und halten diese kompatibel mit dem Format erzeugt durch PX_Bool), können Sie die Eigenschaft als BYTE speichern, wie folgt:

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

Wie Sie im Lastfall, eine temporäre Variable wird verwendet und anschließend der Wert zugewiesen, anstatt, Downcasting m_boolProp zu einem Verweis BYTE. Das Gussverfahren würde nur ein Byte von m_boolProp zu, das geändert wurde und fehlgeschlagen würde die übrigen Bytes nicht initialisiert.

Für das gleiche Steuerelement können Sie die Initialisierung des Steuerelements optimieren, indem Sie COleControl::OnResetState überschreiben, wie folgt:

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

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

Obwohl Serialize und OnResetState überschrieben wurden, sollte die Funktion DoPropExchange unverändert beibehalten werden, da sie weiterhin zur Beibehaltung im Eigenschaftensammlungsformat verwendet wird. Es ist wichtig, alle diese drei Funktionen zu, um sicherzustellen, dass das Steuerelement die Eigenschaften konsistent verwaltet, unabhängig von der Persistenzmechanismus der Container verwendet.

Siehe auch

Konzepte

MFC-ActiveX-Steuerelemente: Optimierung