TN064: Apartamento-modelo de subprocesamiento en controles ActiveX

Esta nota técnica explica cómo activar el modelo de apartamento threading en un control ActiveX. Tenga en cuenta que subprocesamiento de apartamento modelo sólo se admite en las versiones de Visual C++ 4.2 o posteriores.

¿Cuál es el modelo de apartamento Threading?

El modelo de apartamento es un enfoque para apoyar objetos incrustados, como controles ActiveX, dentro de una aplicación contenedora multiproceso. Aunque la aplicación puede tener varios subprocesos, cada instancia de un objeto incrustado se asignará a un "apartamento" que se ejecutará en un único subproceso. En otras palabras, todas las llamadas en una instancia de un control ocurrirá en el mismo subproceso.

Sin embargo, distintas instancias del mismo tipo de control pueden asignarse a diferentes departamentos. Así, si varias instancias de un control de compartan cualquier dato en común (por ejemplo, datos estáticos o globales), entonces acceso a estos datos compartidos tendrá que ser protegido por un objeto de sincronización, como una sección crítica.

Para obtener más detalles sobre el modelo de subprocesos, vea procesos y subprocesos en la referencia del programador de OLE.

¿Por qué apoyar apartamento modelo de subprocesamiento?

Controles que admiten el modelo de apartamento threading pueden utilizarse en aplicaciones multiproceso contenedor que también admiten el modelo de apartamento. Si no habilita el subprocesamiento de apartamento modelo, se limitará el potencial conjunto de contenedores en que se puede usar el control.

Activación de subprocesamiento de apartamento modelo es fácil para la mayoría de los controles, especialmente si tienen poco o ningún datos compartidos.

Protección de datos compartidos

Si el control utiliza datos compartidos, tales como una variable de miembro estático, acceso a que datos deben protegerse con una sección crítica para impedir la modificación de los datos al mismo tiempo más de un subproceso. Para configurar una sección crítica para este propósito, declare una variable de miembro estático de la clase CCriticalSection en la clase del control. Utilice las funciones de miembro de bloqueo y desbloqueo de este objeto de sección crítica siempre que el código tiene acceso a los datos compartidos.

Consideremos, por ejemplo, una clase de control que se debe mantener una cadena que es compartida por todas las instancias. Esta cadena puede mantenerse en una variable de miembro estático y protegida por una sección crítica. Declaración de la clase del control podría contener lo siguiente:

clase CSampleCtrl: COleCo&ntrol pública
{
 nbsp;  ...
    _strShared de CString estático;
    _critSect de CCriticalSection estático;
}

La implementación de la clase incluiría las definiciones de estas variables:

 int CString CSampleCtrl::_strShared;
CCriticalSection CSampleCtrl::_critSect

Acceso a la _strShared miembro estático, a continuación, puede ser protegida por la sección crítica:

void CSampleCtrl::SomeMethod()
{
 nbsp;  _critSect.Lock();
    Si (_strShared.Empty())
        _strShared = "<text>";
    _critSect.Unlock();
    ...
}

Registrar un Control apartamento modelo consciente

Controles que admiten el modelo de apartamento threading deben indicar esta capacidad en el registro, agregando el valor con nombre "ThreadingModel" con un valor de "Apartamento" en su entrada de registro de ID de clase bajo el id de clase\ claveInprocServer32 . Para provocar esta clave para ser registrado automáticamente para su control, pase el afxRegApartmentThreading bandera en el sexto parámetro a AfxOleRegisterControlClass:

BOOL CSampleCtrl::CSampleCtrlFactory::UpdateRegistry(BOOL bRegister)
{
    Si (bRegister)
        Volver () AfxOleRegisterControlClass
            AfxGetInstanceHandle(),
            m_clsid,
            m_lpszProgID,
            IDS_SAMPLE,
            IDB_SAMPLE,
            afxRegApartmentThreading,
            _dwSampleOleMisc,
            _tlid,
            _wVerMajor,
            _wVerMinor);
    otra cosa
        volver a AfxOleUnregisterClass (m_clsid, m_lpszProgID);
}

Si su proyecto de control fue generado por ControlWizard en Visual C++ versión 4.1 o posterior, este indicador ya estará presente en el código. Cambios no son necesarios para registrar el modelo de subprocesamiento.

Si el proyecto se ha generado por una versión anterior de ControlWizard, el código existente tendrá un valor de tipo boolean como el sexto parámetro. Si el parámetro existente es TRUE, cambiarlo a afxRegInsertable | afxRegApartmentThreading . Si el parámetro existente es FALSE, cambiar a afxRegApartmentThreading.

Si el control no siguen las normas para el subprocesamiento de apartamento modelo, no debe pasar afxRegApartmentThreading en este parámetro.

&Notas técnicas por número |nbsp; Notas técnicas por categoría

Index