TN064: Threading di Apartment- Modello in controlli ActiveX
[!NOTA]
La seguente nota tecnica non è stata aggiornata dalla prima volta che viene inclusa nella documentazione online.Di conseguenza, alcune procedure e argomenti potrebbero non essere aggiornati o errati.Per le informazioni più recenti, è consigliabile cercare l'argomento di interesseindice della documentazione online.
Questa nota tecnica viene illustrato come abilitare il threading di apartment-modello in un controllo ActiveX.Si noti che il threading di apartment-modello è supportato solo in versioni 4,2 di Visual C++ o in avanti.
Qual è il threading di Apartment-Modello?
Il modello STA rappresenta un metodo a supportare gli oggetti incorporati, come controlli ActiveX, all'interno di un'applicazione contenitore multithreading.Anche se l'applicazione può avere più thread, ogni istanza di un oggetto incorporato verrà assegnata a un “apartment,„ che verrà eseguito solo su un thread.Ovvero tutte le chiamate in un'istanza di un controllo si verificano nello stesso thread.
Tuttavia, le istanze diverse dello stesso tipo di controllo possono essere distribuite a apartment diversi.Quindi, se più istanze di un controllo condividono i dati in comune, ad esempio dati statici o globale), quindi accesso ai dati condivisi devono essere protetti da un oggetto di sincronizzazione, ad esempio una sezione critica.
Per informazioni dettagliate sul modello di threading apartment, vedere processi e threadnel riferimento del programmatore OLE.
Poiché threading di Apartment-Modello di supporto?
I controlli che supportano il threading di apartment-modello possono essere utilizzati nelle applicazioni contenitori multithreading che supportano inoltre il modello STA.Se non si abilita il threading di apartment-modello, si limiterà il potenziale set di contenitori in cui il controllo può essere utilizzato.
Abilitare il threading di apartment-modello è semplice per la maggior parte dei controlli, in particolare se che presentano poche o nessun dati condivisi.
Dati condivisi impedisce
Se il controllo utilizza i dati condivisi, come una variabile membro statico, l'accesso a quello i dati devono essere protette con una sezione critica impedire più di un thread di modificare i dati contemporaneamente.Per impostare una sezione critica a questo scopo, dichiarare una variabile membro statico di una CCriticalSection nella classe del controllo.Utilizzare le funzioni membro di Unlock e di Lock di questo oggetto sezione critica in qualsiasi punto del codice accede ai dati condivisi.
Si consideri, ad esempio, una classe del controllo che deve gestire una stringa che è condivisa da tutte le istanze.Questa stringa può essere gestita in una variabile membro statico e protetto da una sezione critica.La dichiarazione della classe del controllo contiene quanto segue:
class CSampleCtrl : public COleControl
{
...
static CString _strShared;
static CCriticalSection _critSect;
};
L'implementazione della classe include le definizioni di queste variabili:
int CString CSampleCtrl::_strShared;
CCriticalSection CSampleCtrl::_critSect;
Accesso al membro statico di _strShared può quindi essere protetto dalla sezione critica:
void CSampleCtrl::SomeMethod()
{
_critSect.Lock();
if (_strShared.Empty())
_strShared = "<text>";
_critSect.Unlock();
...
}
registrare un controllo Apartment-Modello-Informato
I controlli che supportano il threading di apartment-modello forniscano questa funzionalità nel Registro di sistema, aggiungendo il valore denominato “ThreadingModel„ con il valore “apartment„ nella rispettiva voce del Registro di sistema ID della classe con l'id della classe\InprocServer32 .Per attivare questa chiave automaticamente a essere registrato per il controllo, passare il flag di afxRegApartmentThreading nel sesto parametro a AfxOleRegisterControlClass:
BOOL CSampleCtrl::CSampleCtrlFactory::UpdateRegistry(BOOL bRegister)
{
if (bRegister)
return AfxOleRegisterControlClass(
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_SAMPLE,
IDB_SAMPLE,
afxRegApartmentThreading,
_dwSampleOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
else
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}
Se il progetto di controllo è stato generato da ControlWizard versioni in 4,1 di Visual C++ o in avanti, questo flag già viene visualizzato nel codice.Non sono presenti modifiche da registrare il modello di threading.
Se il progetto è stato generato da una versione precedente di ControlWizard, il codice esistente avrà un valore boolean come il sesto parametro.Se il parametro esistente è VERO, modificarla inafxRegInsertable | afxRegApartmentThreading.Se il parametro esistente è FALSE, modificarla inafxRegApartmentThreading.
Se il controllo non segue le regole per threading di apartment-modello, non è necessario passare afxRegApartmentThreading in questo parametro.