Diese technische Hinweis erläutert Apartmentmodell Threads in ein ActiveX-Steuerelement zu aktivieren. Beachten Sie, dass Modell Apartment threading ist nur in Visual C++, Version 4.2 oder höher unterstützt.
Was Modell Apartment Threading ist?
Das Apartment-Modell ist ein Ansatz zur Unterstützung von eingebetteter Objekten, wie z. B. ActiveX-Steuerelemente, innerhalb einer Multithread Containeranwendung. Obwohl die Anwendung mehrere Threads haben, wird jede Instanz eines eingebetteten Objekts zugewiesen werden eine "Apartment" auf nur ein Thread ausgeführt wird. Mit anderen Worten, werden alle Anrufe in eine Instanz eines Steuerelements auf dem gleichen Thread passieren.
Jedoch können verschiedene Wohnungen unterschiedliche Instanzen des gleichen Typs von Steuerelement zugewiesen werden. Also, wenn mehrere Instanzen eines Steuerelements Daten gemeinsam (z. B. globale oder statische Daten) teilen, Zugang zu diesen freigegebenen Daten müssen durch ein Synchronisierungsobjekt, z. B. einen kritischen Abschnitt geschützt werden.
Ausführliche Informationen über das Apartment-Threadingmodell finden Sie unter Prozesse und Threads in der OLE Programmer's Reference.
Warum unterstützen Modell Apartment Threading?
Steuerelemente, die Modell-Apartment threading unterstützen können in Multithread-Containeranwendungen verwendet werden, die auch das Apartment-Modell unterstützen. Wenn Sie Modell-Apartment threading nicht aktivieren, werden Sie den möglichen Satz von Containern begrenzen in denen das Steuerelement verwendet werden kann.
Aktivieren der Modell-Apartment threading ist einfach für die meisten Steuerelemente, insbesondere, wenn sie wenig oder gar keine gemeinsam genutzten Daten haben.
Schützen freigegebener Daten
Wenn Ihr Steuerelement freigegebene Daten verwendet wie z. B. eine statische Member-Variable, Zugriff auf Daten mit einem kritischen Abschnitt zu verhindern, dass mehr als ein Thread die Daten gleichzeitig ändern geschützt werden sollten. Um einen kritischen Abschnitt für diesen Zweck eingerichtet, deklarieren Sie eine statische Member-Variable der Klasse CCriticalSection in die Steuerelementklasse. Verwenden Sie die Lock und Unlock Memberfunktionen des kritischen Abschnitts-Objekts, wo immer Ihr Code die freigegebenen Daten zugreift.
Betrachten Sie z. B. eine Control-Klasse, die eine Zeichenfolge beibehalten, die von allen Instanzen gemeinsam genutzt werden muss. Diese Zeichenfolge kann in eine statische Member-Variable beibehalten und durch einen kritischen Abschnitt geschützt werden. Klassendeklaration des Steuerelements würde Folgendes enthalten:
cSampleCtrl-Klasse: öffentliche COleControl
{
&Nbsp; ...
statische CString _strShared;
statische CCriticalSection _critSect;
}
Die Implementierung für die Klasse würde Definitionen für diese Variablen enthalten.:
int CString CSampleCtrl::_strShared;
CCriticalSection CSampleCtrl::_critSect
Zugriff auf die _strShared statischer Member kann dann den kritischen Abschnitt geschützt werden:
void CSampleCtrl::SomeMethod()
{
Nbsp; _critSect.Lock();
Wenn (_strShared.Empty())
_strShared = "<text>";
_critSect.Unlock();
...
}
Registrieren eines Apartment-Modell-fähige Steuerung
Steuerelemente, die Modell-Apartment threading unterstützen sollten diese Fähigkeit in der Registrierung angeben, durch Hinzufügen des benannten Werts "ThreadingModel" mit dem Wert "Apartment" in ihrer Klasse-ID-Registrierungseintrag unter die Klassen-Id\InprocServer32 -Schlüssel. Übergeben Sie um diese Taste, um automatisch registriert werden, für das Steuerelement zu verursachen, das afxRegApartmentThreading -Flag in der sechste Parameter AfxOleRegisterControlClass:
BOOL CSampleCtrl::CSampleCtrlFactory::UpdateRegistry(BOOL bRegister)
{
&Nbsp; Wenn (bRegistrieren Sie sich)
() AfxOleRegisterControlClass zurückgegeben
AfxGetInstanceHandle(),
M_clsid,
M_lpszProgID,
IDS_SAMPLE,
IDB_SAMPLE,
AfxRegApartmentThreading,
_dwSampleOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
anderes
Rückkehr AfxOleUnregisterClass (M_clsid, M_lpszProgID);
}
Wenn das Projekt von ControlWizard in Visual C++, Version 4.1 oder höher generiert wurde, wird dieses Flag bereits in Ihrem Code vorhanden sein. Keine Änderungen sind erforderlich, um das Threadmodell zu registrieren.
Wenn Ihr Projekt von einer früheren Version von ControlWizard generiert wurde, müssen Sie den vorhandene Code einen booleschen Wert als der sechste Parameter. Wenn der vorhandene Parameter TRUE ist, ändern Sie ihn zu afxRegInsertable | afxRegApartmentThreading . Wenn der vorhandene Parameter FALSE ist, es zu ändern afxRegApartmentThreading.
Wenn das Steuerelement nicht die Regeln für das Modell Apartment threading folgt, müssen Sie nicht weiter afxRegApartmentThreading in diesem Parameter.
Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie