Esta anotação técnica explica como habilitar o modelo de apartment threading em um controle ActiveX. Observe que o modelo de apartment threading só é suportado em versões do Visual C++ 4.2 ou posteriores.
O que é modelo de Apartment Threading?
O modelo de apartment é uma abordagem para suporte a objetos incorporados, como controles ActiveX, dentro de um aplicativo contêiner multithread. Embora o aplicativo pode ter Múltiplo segmentos, cada instância de um objeto incorporado será atribuída para um "Apartamento," que será executado em uma única thread. Em outras palavras, todas as chamadas em uma instância de um Controlarar acontecerá no mesmo thread.
No entanto, instâncias diferentes do mesmo tipo de controle podem ser atribuídas a diferentes apartamentos. Assim, se várias instâncias de um Controlarar de partilham quaisquer dados em comum (por exemplo, dados estáticos ou globais), em seguida, acesso aos dados compartilhados precisará ser protegido por um objeto de sincronização, como uma seção crítica.
Para obter detalhes completos sobre o modelo de threading de apartamento, por favor, consulte processos e segmentos no OLE Programmer Referência.
Por que o suporte modelo de Apartment Threading?
Controles que suportam o modelo de apartment threading podem ser usados em aplicativos de contêiner multithread que também oferecem suporte o modelo de apartment. Se você não habilitar o modelo de apartment threading, você limitará o conjunto de potencial dos recipientes em que seu Controlarar pode ser usado.
Habilitar o modelo de apartment threading é fácil para a maioria dos controles, especialmente se eles têm pouca ou nenhuma dados compartilhados.
Protegendo os dados compartilhados
Se o Controlarar usa dados compartilhados, tais como uma variável de membro estático, acesso ao que os dados devem ser protegidos com uma seção crítica para impedir mais de um segmento de modificar os dados ao mesmo tempo. Para definir uma seção crítica para esta finalidade, declare uma variável de membro estático da classe CCriticalSection na classe do Controlarar. Use as funções de membro Lock e Unlock deste objeto de seção crítica sempre que seu código acessa os dados compartilhados.
Considere, por exemplo, uma classe de Controlarar que deve manter uma Cadeia de caracteres que é compartilhada por todas as instâncias. Essa seqüência pode ser mantida em uma variável de membro estático e protegida por um crítico seção. Declaração de classe do Controlarar conterá as seguintes:
classe CSampleCtrl: público COleCo&ntrol
{
nbsp; ...
_strShared de CString estático;
_critSect de CCriticalSection estático;
}
A implementação para a classe incluiria definições para essas variáveis:
int CString CSampleCtrl::_strShared;
CSampleCtrl::_critSect de CCriticalSection
Acessar para o _strShared membro estático, em seguida, pode ser protegido pela seção crítica:
privatevoid CSampleCtrl::SomeMethod()
{
nbsp; _critSect.Lock();
se (_strShared.Empty())
_strShared = "<text>";
_critSect.Unlock();
...
}
Registrar um controle orientado a apartamento-modelo
Controles que suportam o modelo de apartment threading devem indicar esse recurso no registro, adicionando o valor nomeado "ThreadingModel" com um valor de "Apartamento" em sua entrada de registro de ID de classe sob a identificação de classe\ chaveInprocServer32 . Para fazer com que essa chave para ser registrado automaticamente para o seu Controlarar, passar o afxRegApartmentThreading sinalizador no sexto parâmetro para AfxOleRegisterControlClass:
BOOL CSampleCtrl::CSampleCtrlFactory::UpdateRegistry(BOOL bRegister)
{
se (bRegister)
retornar (AfxOleRegisterControlClass
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_SAMPLE,
IDB_SAMPLE,
afxRegApartmentThreading,
_dwSampleOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
outra pessoa
retornar AfxOleUnregisterClass (m_clsid, m_lpszProgID);
}
Se seu projeto de Controlarar foi gerado por WebAssistente no Visual C++ versão 4.1 ou posterior, esta bandeira já estarão presente no seu código. Nenhuma alteração é necessária para registrar o modelo de threading.
Se seu projeto foi gerado por uma versão anterior do WebAssistente, seu código existente terá um valor booleano como o sexto parâmetro. Se o parâmetro existente é TRUE, altere-a para afxRegInsertable | afxRegApartmentThreading . Se o parâmetro existente é FALSE, altere-a para afxRegApartmentThreading.
Se seu Controlarar não segue as regras de segmentação de compartimento-modelo, você não deve passar afxRegApartmentThreading neste parâmetro.
Técnico anotações por número |nbsp; &Notas técnicas por categoria