Sincronização de chamadas

Os aplicativos COM devem ser capazes de lidar corretamente com a entrada do usuário durante o processamento de uma ou mais chamadas de COM ou do sistema operacional. O COM fornece sincronização de chamadas somente para Apartments de thread único. O Apartments multithread (que contém threads de thread livre) não recebe chamadas ao fazer chamadas (no mesmo thread). O Apartments multithread não pode fazer chamadas sincronizadas de entrada. As chamadas assíncronas são convertidas em chamadas síncronas em Apartments multithread. O filtro de mensagem não é chamado para nenhum thread em um apartamento multithread. Para obter mais informações sobre problemas de Threading, consulte processos, threads e Apartments.

As chamadas COM entre os processos se enquadram em três categorias, da seguinte maneira:

Chamadas síncronas

A maioria das comunicações que ocorrem no COM é síncrona. Ao fazer chamadas síncronas, o chamador aguarda a resposta antes de continuar e pode receber mensagens de entrada enquanto aguarda. COM entra em um loop modal para aguardar a resposta, receber e despachar outras mensagens de maneira controlada.

Notificações assíncronas

Ao enviar notificações assíncronas, o chamador não aguarda a resposta. O COM usa eventos de alto nível ou de uma mensagem para enviar notificações assíncronas, dependendo da plataforma. COM define cinco métodos assíncronos de IAdviseSink:

Observação

Embora o COM esteja processando uma chamada assíncrona, não é possível fazer chamadas síncronas. Por exemplo, a implementação de um aplicativo de contêiner de OnDataChange não pode conter uma chamada para IPersistStorage:: Save. Essas chamadas são as únicas chamadas assíncronas com suporte do COM. Não é possível criar uma interface personalizada que seja assíncrona no momento.

 

Chamadas de entrada sincronizadas

Ao fazer chamadas sincronizadas de entrada, o objeto chamado deve concluir a chamada antes de produzir o controle. Isso ajuda a garantir que o gerenciamento de foco funcione corretamente e que os dados inseridos pelo usuário sejam processados adequadamente. Essas chamadas são feitas por COM por meio da função SendMessage , sem entrar em um loop modal. Ao processar uma chamada de entrada sincronizada, o objeto chamado não deve chamar nenhuma função ou método (incluindo métodos síncronos) que pode gerar controle. Os métodos a seguir são de entrada sincronizada

Para minimizar os problemas que podem surgir no processamento assíncrono de mensagens, a maioria das chamadas de método COM é síncrona. Com a comunicação síncrona, não há necessidade de código especial para enviar e tratar mensagens de entrada. Quando um aplicativo faz uma chamada de método síncrona, COM entra em um loop de espera modal que manipula as respostas necessárias e envia mensagens de entrada para aplicativos capazes de processá-las.

O COM gerencia chamadas de método atribuindo um identificador chamado ID de thread lógico. Um novo é atribuído quando um usuário seleciona um comando de menu ou quando o aplicativo inicia uma nova operação COM. As chamadas subsequentes relacionadas à chamada COM inicial recebem a mesma ID de thread lógico que a chamada inicial.