levantamento inicial

objectivo: desenvolver uma aplicação que controle outra.
– ambas têm ui => não estamos a dizer por exemplo para uma aplicação controlar um servidor.
– queremos que a aplicação controlada pareça uma janela da aplicação principal (tipo mdi).
– queremos abrir uma janela da aplicação controlada a partir de um evento da aplicação principal, por exemplo seleccionar uma opção de um menu e abrir a aplicação controlada num determinado estado.
– queremos restringir algumas acções na janela da aplicação controlada (controlar o tamanho, local onde pode estar a janela, etc.)
– a aplicação que queremos correr por sua vez corre dentro de uma espécie de runtime, ou seja corremos o runtime com determinados parametros para abrir a nossa aplicação no sitio que queremos.
– não convém estar sempre a correr o runtime por causa do tempo inicial de carregamento.
– a aplicação que vai correr dentro da janela controlada necessita de ter carregada um conjunto de informações globais que demoram algum tempo a carregar pelo que não podemos estar sempre a iniciar essa aplicação, temos que carregar essas informações uma vez e depois aproveitar essa sessão.

opções existentes para comunicação entre processos:
– let the apps communicate over a socket (not very efficient, but pretty easy to do)
– use a named pipe (in windows NT, at least – Linux too, I think)
– if the processes are windows, you can use SendMessage (in the Win32 API), assuming you can get each window’s handle (via FindWindow or somesuch)
– use a memory-mapped file
– use a normal file, with some manner of locking (exclusive writes, for example)

a solução escolhida é o runtime que lança as janelas que queremos controlar correr inicialmente um socket server que fica à escuta de pedidos da aplicação principal e inicia os programas que nós pedimos. desta forma ultrapassamos a questão de correr várias vezes o runtime (que corre só uma vez) bem como de correr várias vezes o código que carrega as informações globais (que ficando integrado no socket server corre também só uma vez). isto resolve-nos o problema de enviar pedidos de uma aplicação para outra.
como não é a aplicação principal a iniciar esses programas (que têm janelas próprias) não conseguimos controlar directamente as suas janelas por isso temos que usar a Win32 API para fazer essa gestão de janelas.
– a opção de ficheiros (seja memory-mapped ou ficheiros normais) poderia ser interessante se quisessemos trocar dados entre as aplicações, mas no nosso caso a informação que passa entre aplicações são simples pedidos e indicação de sucesso desses pedidos.
– não explorei a opção named pipes

outros links
http://www.codeproject.com/csharp/DotNetNamedPipesPart2.asp
http://www.error-bank.com/microsoft.public.dotnet.languages.vb.1/193496_Thread.aspx

por Vitor Silva



Comments are closed.