none
Threads, Apartment RRS feed

  • Pergunta

  •  

    Olá Srs,

     

    Alguém pode me esclarecer como funciona as Threads no Windows?

    O que são os Apartments, porques eles existem?

     

    hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);

    hr = ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

     

    Qual seria as diferenças das linhas acima e de STA e MTA ?

    Já li algo a respeito no Code Project,

    mas não assimilei muito bem.

     

     

    Meu problema:

     

    Em um projeto ATL Windows Service (VSNET 2003), era necessário

    utilizar uma DLL COM com eventos.

    Um exemplo de código para se

    utilizar os eventos dessa DLL no projeto

    foi feito por um desenvolvedor externo.

     

    Acontece que os eventos mapeados dessa DLL são disparados

    em uma outras threads criadas automaticamente.

    Os eventos, ora são disparados numa

    mesma thread (ID já existente), ora outra

    thread é criada e utilizada. As threads não mais usadas não

    são finalizadas imediatamente, mas sim, depois de

    um certo tempo.

     

    O serviço, assim, que era pra ter 3 ou 4 threads,

    fica oscilando com 14, 9, 12, etc threads.

     

    O serviço está sendo criticado por isso, e que essa

    quantidade de threads possa estar causando

    problema com a performance do mesmo.

     

    Se eu utilizar hr = ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

    os eventos da DLL não são disparados.

     

    Alguém tem alguma idéia?

    Se for muito trabalho pelo forum, posso entrar em contato

    telefônico ou coisa do tipo.

     

    Mando maiores detalhes do código.

     

     

    Grato

    Anderson

    email-msn: andersonaap@hotmail.com

    quarta-feira, 11 de julho de 2007 12:42

Todas as Respostas

  • acho que pra começar, vc precisa entender o conceito de apartment que é:

     

    • É um container logico dentro de uma aplicação para objetos COM que compartilham a regra de acesso da mesma thread.

     

    podemos procurar entender a necessidade desses containers logicos dentro de uma aplicação como a busca pelo tal Thread-Safety.

     

    mas basicamente, qual a diferença entre MTA e STA?

     

    • STA: Single Thread Apartment -> em uma aplicação Multi-thread, existe a necessidade de manter o estado interno do objeto corretamente (thread-safety), e quando criamos um Serviço STA, essa implementação já ocorre para nós. Assim, nao corremos o risco de ter um indesejavel efeito durante o acesso ao objeto por varias threads. A sincronia de acesso é garantida pela Message Queue (ou message pump) do objeto.
    • MTA: Multi Thread Apartment -> Consistem de uma ou mais threads, e os objetos residentes nesse apartment podem ser acessados diretamente (ao contrario do STA, em que o acesso eh controlado pelo msg pump). A sincronia de acesso aqui deve ser implementada pelo proprio objeto.

     

    o que deve estar ocorrendo com vc, é que o seu server(a dll) deve ser MTA (esta talvez seja a razao para criar as threads e dispara-las) e por isso o seu client soh funciona qnd eh MTA. talvez vc possa rescrever o server para controlar esse comportamento.

    terça-feira, 24 de julho de 2007 23:28