Desenvolvimento de Aplicações Distribuídas - 2019/20201º Ano, 1º SemestreMEIC - Campus AlamedaMEIC - Campus Tagus Park METI - Campus Tagus Park |
Aula nº 2 - Programação Baseada em Eventos
Material de apoio:
- Slides (pdf)
A - Delegates
Estude e execute o exemplo exercicio-1.cs. Modifique o exemplo como achar necessário de forma a responder às seguintes questões:
- Localize no código como é feita a adição, remoção e atribuição de métodos ao delegate e onde é feita a invocação do delegate.
- Por que ordem são executados os métodos registados nos delegates?
- O que acontece se igualar um delegate a null antes do invocar?
- É possível adicionar métodos estáticos a delegates?
- O que acontece aos métodos registados no delegate se um novo método é atribuído? São invocados?
- Verifique que é possível passar um delegate como argumento e ser invocado dentro de um método.
B - Eventos
Estude o código exercicio-2.cs que pretende simular um controlo de um form - um slider. Um slider é caracterizado unicamente por uma posição que varia. Como se trata de uma simulação, esta posição é actualizada programaticamente pelo set do atributo Position e não por interacção do rato.
a) Implemente o código necessário de modo a garantir o seguinte:
- A posição do slider é actualizada com a nova posição apenas se esta for válida.
- Para validar a posição, o slider desencadeia um evento antes de fazer a atribuição da posição.
- Deve ser adicionada ao evento uma callback tal que, se a nova posição for maior que 50, então é inválida.
- Na classe Slider, sugere-se a criação do evento Move e a actualização da propriedade Position.
- Recomenda-se a criação da classe MoveEventArgs para transferência de argumentos.
b) Verifique o que acontece quando tenta desencadear o evento fora da classe onde este está declarado.
C - Threads
Implemente uma thread pool tal que:
- A thread pool ThrPool é inicializada com um conjunto de N threads.
- A aplicação submete um delegate do tipo ThrWork para execução assíncrona invocando o método AssyncInvoke.
- Os pedidos de invocação são colocados num buffer gerido de forma circular.
- Threads que estejam livres podem consumir pedidos, caso contrário ficam bloqueadas.
- Quando uma thread consome um pedido, retira-o do buffer e executa o pedidoe volta a verificar se existem pedidos pendentes.
Complemente o código do exercicio-3.cs.
Exercício Suplementar
Multithreading em Windows Forms
O programa AsynchCalcPi.zip permite calcular o número Pi com a precisão indicada pelo utilizador. Calcula nove dígitos de cada vez entre actualizações da interface. Observe o código fonte.
a) Execute o programa (sugere-se com um número elevado de dígitos, por exemplo 1000). Enquanto o programa efectua os cálculos, porque razão ao minimizar e ao maximizar a janela, esta deixou de ser desenhada? Considere o seguinte:
- Existe uma user interface (UI) thread dedicada ao tratamento de eventos da interface. À medida que são gerados, os eventos são colocados numa message queue e tratados sequencialmente pela UI thread.
- Os controlos (e.g. botões, text boxes, etc.) ao serem criados, ficam associados à thread que a criou de tal modo que só essa thread pode manipular o controlo (e.g. modificar as propriedades ou invocar métodos).
- Os únicos métodos dos controlos que podem ser acedidos por outras threads de forma segura são os métodos Invoke, BeginInvoke, EndInvoke que permitem submeter acções para serem executadas pela thread associada ao controlo.
b) Estude a solução proposta nos artigos seguintes. São usados delegates assíncronos que usam uma thread pool existente internamente ao CLR - common language runtime.