Compartilhar via


TN064: Modelo Apartment Threading em controles do ActiveX

Observação:

A seguinte nota técnica não foi atualizada desde que foi incluída pela primeira vez na documentação online.sistema autônomo resultado, alguns procedimentos e tópicos podem estar desatualizado ou incorreto.Para obter informações mais recentes, é recomendável que você procurar o tópico de interesse no índice de documentação online.

Esta nota técnica explica como habilitar o modelo apartment threading em um controle ActiveX.Observe que modelo apartment threading é suportado somente nas versões do Visual C++ 4.2 ou posteriores.

O que é o modelo Apartment Threading?

O modelo de apartment é uma abordagem para dar suporte a objetos incorporados, sistema autônomo controles ActiveX, dentro de um aplicativo de contêiner multithread.Embora o aplicativo possa ter vários segmentos, cada instância de um objeto incorporado será atribuída para um "apartment," que irá executar em apenas um thread.Em outras palavras, todas as chamadas em uma instância de um controle acontecerá no mesmo thread.

Entretanto, instâncias diferentes do mesmo tipo de controle podem ser atribuídas a apartments diferentes.Portanto, se várias instâncias de um controle compartilham sistema autônomo dados em comum (por exemplo, dados estático ou global), acesso a esses dados compartilhados será necessário a ser protegido por um objeto de sincronização, sistema autônomo uma seção crítica.

Para obter detalhes completos no modelo apartment threading, consulte Processos e threads in the Referência do programador de OLE.

Por que suporte modelo Apartment Threading?

Controles que suportam o modelo apartment threading podem ser usados em aplicativos multithreaded recipientes que também suportam o modelo de apartment.Se você não habilitar o modelo apartment threading, você limitará o conjunto de possível de recipientes no qual o controle pode ser usado.

Ativar modelo apartment threading é fácil para a maioria dos controles, especialmente se eles têm pouca ou nenhuma dados compartilhados.

Protegendo dados compartilhados

Se o seu controle usa dados compartilhados, sistema autônomo uma variável de membro estático acesso com sistema autônomo dados devem ser protegidos com uma seção crítica para impedir que mais de um segmento de modificar sistema autônomo dados ao mesmo time.Para configurar uma seção crítica para essa finalidade, declare uma variável de membro estático da classe CCriticalSection na classe do controle. Use o Lock e Desbloquear funções de membro de crítica esta seção objeto onde quer que seu código acessa os dados compartilhados.

Considere, por exemplo, uma classe de controle que precisa para manter uma seqüência de caracteres que é compartilhada por todas as instâncias.Essa seqüência de caracteres pode ser mantida em uma variável de membro estático e protegida por uma seção crítica.Declaração de classe do controle deve conter o seguinte:

class CSampleCtrl : public COleControl
{
    ...
    static CString _strShared;
    static CCriticalSection _critSect;
};

A implementação da classe inclui definições para essas variáveis:

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

Acesso à _strShared membro estático, em seguida, pode ser protegido através da seção crítica:

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

Registrando um controle Apartment-Model-Aware

Controles que suportam o modelo apartment threading devem indicar esse recurso no registro, adicionando o valor nomeado "ThreadingModel" com um valor de "Apartment" na entrada de registro sua classe ID sob aidentificação de classe\InprocServer32 chave.Para fazer com que essa chave para ser registrado automaticamente para o seu controle, passar o afxRegApartmentThreading sinalizar no sexto parâmetro para 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 seu projeto de controle foi gerado pelo WebAssistente no Visual C++ versão 4.1 ou posterior, este sinalizar já estará presente no seu código.Não são necessárias alterações para registrar o modelo de threading.

Se o projeto foi gerado por uma versão anterior do WebAssistente, seu código existente terá um valor booliano sistema autônomo o sexto parâmetro.Se o parâmetro existente for TRUE, alterar-o para afxRegInsertable | afxRegApartmentThreading. Se o parâmetro existente for falso, altere-o para afxRegApartmentThreading.

Se o controle não segue as regras de modelo apartment threading, você não deve passar afxRegApartmentThreading neste parâmetro.

Consulte também

Outros recursos

Notas técnicas por número

Notas técnicas por categoria