Partilhar via


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 do COM ou do sistema operacional. A COM fornece sincronização de chamadas apenas para apartamentos de thread único. Apartamentos multithreaded (contendo threads free-threaded) não recebem chamadas ao fazer chamadas (no mesmo thread). Os apartamentos multithreaded não podem fazer chamadas sincronizadas de entrada. As chamadas assíncronas são convertidas em chamadas síncronas em apartamentos multithreaded. O filtro de mensagens não é chamado para qualquer thread em um apartamento multithreaded. Para obter mais informações sobre problemas de threading, consulte Processos, threads e apartamentos.

As chamadas COM entre processos dividem-se em três categorias, como se segue:

Chamadas síncronas

A maior parte da comunicação que ocorre dentro da COM é síncrona. Ao fazer chamadas síncronas, o chamador aguarda a resposta antes de continuar e pode receber mensagens recebidas enquanto espera. COM entra em um loop modal para aguardar a resposta, recebendo e despachando outras mensagens de forma controlada.

Notificações assíncronas

Ao enviar notificações assíncronas, o chamador não espera pela resposta. A COM usa PostMessage ou eventos de alto nível para enviar notificações assíncronas, dependendo da plataforma. COM define cinco métodos assíncronos de IAdviseSink:

Observação

Enquanto o COM está processando uma chamada assíncrona, chamadas síncronas não podem ser feitas. Por exemplo, a implementação de um aplicativo contêiner de OnDataChange não pode conter uma chamada para IPersistStorage::Save. Essas chamadas são as únicas chamadas assíncronas suportadas pelo COM. Não há nenhuma maneira de criar uma interface personalizada que é assíncrona no momento.

 

Chamadas sincronizadas de entrada

Ao fazer chamadas sincronizadas de entrada, o objeto chamado deve concluir a chamada antes de produzir controle. Isso ajuda a garantir que o gerenciamento de foco funcione corretamente e que os dados inseridos pelo usuário sejam processados adequadamente. Estas chamadas são feitas pela COM através da função SendMessage, sem entrar num loop modal. Durante o processamento de uma chamada sincronizada de entrada, o objeto chamado não deve chamar nenhuma função ou método (incluindo métodos síncronos) que possa gerar controle. Os seguintes métodos são sincronizados de entrada:

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

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 o mesmo ID de thread lógico que a chamada inicial.