Questa nota tecnica viene descritto come attivare l'appartamento-modello di threading di un controllo ActiveX. Si noti che il modello di apartment filettatura è supportato solo nelle versioni di Visual C++ 4.2 o versioni successive.
Che cosa è il modello di Apartment filettatura?
Il modello dell'appartamento è un approccio a supportare gli oggetti incorporati, come ad esempio i controlli ActiveX, all'interno di un'applicazione contenitore con multithreading. Anche se l'applicazione può avere più thread, ogni istanza di un oggetto incorporato verrà assegnato un "Appartamento", che verrà eseguito su un solo thread. In altre parole, tutte le chiamate in un'istanza di un controllo accadrà sullo stesso thread.
Tuttavia, diverse istanze dello stesso tipo di controllo possono essere assegnate a diversi appartamenti. Così, se più istanze di un controllo condividono tutti i dati in comune (ad esempio, dati statici o globali), allora l'accesso a tali dati condivisi avrà bisogno di essere protetto da un oggetto di sincronizzazione, ad esempio una sezione critica.
Per dettagli completi sul modello di threading apartment, vedere processi e thread nel riferimento di OLE Programmer.
Perché sostenere modello Apartment filettatura?
I controlli che supportano il modello di apartment filettare possono essere utilizzati in applicazioni multithread contenitore che supportano anche il modello di appartamento. Se non si attiva il modello di apartment filettare, si limiterà il potenziale set di contenitori in cui poteva essere usato il controllo.
L'abilitazione modello apartment filettatura è facile per la maggior parte dei controlli, in particolare se hanno poca o nessuna dati condivisi.
Proteggere i dati condivisi
Se il controllo utilizza dati condivisi, come ad esempio una variabile membro statico, accedere a che i dati devono essere protetti con una sezione critica per impedire la modifica dei dati allo stesso tempo più thread. Per impostare una sezione critica a questo scopo, dichiarare una variabile membro statico della classe CCriticalSection nella classe del controllo. Utilizzare le funzioni di membro Lock e Unlock di questo oggetto sezione critica ovunque il codice accede ai dati condivisi.
Si consideri, ad esempio, una classe di controllo che deve mantenere una stringa che è condiviso da tutte le istanze. Questa stringa può essere mantenuta in una variabile membro statico e protetta da una sezione critica. Dichiarazione della classe del controllo dovrebbe contenere le seguenti:
classe mappa: COleCo&ntrol pubblica
{
nbsp; ...
_strShared CString statico;
statico CCriticalSection _critSect;
}
L'implementazione della classe dovrebbe includere le definizioni per queste variabili:
int CString CSampleCtrl::_strShared;
CCriticalSection CSampleCtrl::_critSect
L'accesso alla _strShared public static void poi possono essere protetti dalla sezione critica:
public static void CSampleCtrl::SomeMethod()
{
nbsp; _critSect.Lock();
Se (_strShared.Empty())
_strShared = "<text>";
_critSect.Unlock();
...
}
Registrazione di un appartamento-modello-consapevole controllo
I controlli che supportano il modello di apartment filettare dovrebbero indicare questa funzionalità nel Registro di sistema, aggiungendo il valore denominato "ThreadingModel" con un valore di "Appartamento" nella loro voce di registro ID classe sotto l' id di classe\ chiaveInprocServer32 . A causa di questa chiave deve essere automaticamente registrato per il controllo, passare il afxRegApartmentThreading bandiera del sesto parametro AfxOleRegisterControlClass:
BOOL CSampleCtrl::CSampleCtrlFactory::UpdateRegistry(BOOL bRegister)
{
Se (bRegistrazione immediata dei bollettini)
ritorno (AfxOleRegisterControlClass
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_SAMPLE,
IDB_SAMPLE,
afxRegApartmentThreading,
_dwSampleOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
altro
return AfxOleUnregisterClass (m_clsid, m_lpszProgID);
}
Se il progetto di controllo è stato generato dalla creazione guidata controllo in Visual C++ versione 4.1 o versione successiva, questo flag sarà già presente nel codice. Nessuna modifica è necessaria per registrare il modello di threading.
Se il progetto è stato generato da una versione precedente della creazione guidata controllo, codice esistente avrà un valore booleano come sesto parametro. Se il parametro esistente è TRUE, cambiare a afxRegInsertable | afxRegApartmentThreading . Se il parametro esistente è FALSE, cambiare a afxRegApartmentThreading.
Se il controllo non segue le regole per il modello di apartment threading, non deve passare afxRegApartmentThreading in questo parametro.
&Note tecniche per numero |nbsp; Note tecniche per la categoria