Pergunta

Eu tenho um aplicativo Delphi 2006 que reúne dados e o exibe como um resumo de muitos canais, um canal por linha em um TDRAWGRID. Eu tenho o mesmo aplicativo em execução em vários outros PCs na rede, mas esses outros PCs são escravos - eles não coletam dados, mas apenas fornecem uma exibição remota do resumo.

Atualmente, os escravos apenas mostram uma imitação da tela de tela resumida no mestre, e isso é implementado via transmissões por meio de listas de correio do mestre.

Quero implementar isso de uma maneira diferente, reduzir a carga no mestre e fornecer aos escravos um pouco mais de flexibilidade e independência sobre como eles interpretam os dados. Além disso, estou tendo problemas com a transmissão de correio dos dados entre as sub -redes.

Posso usar algum esquema de memória compartilhada para estabelecer os dados em um arquivo mapeado de memória, onde os escravos podem ter acesso de qualquer lugar (até a Web, até)? Estamos falando de um tamanho de memória de 100k bytes Max, digamos, atualizado pelo mestre cerca de uma vez por segundo, provavelmente em um tópico, para manter a tarefa principal em primeiro plano responsiva.

Foi útil?

Solução

A maneira mais simples é usar um arquivo em um compartilhamento para o qual o mestre grava e os escravos apenas leem. Algum tipo de sincronização pode ser necessário, se você quiser evitar "leituras sujas". Por outro lado, pode não importar, dependendo do tipo de dados que você deseja exibir.

O uso de um arquivo simples tem a vantagem de que não requer nenhum software adicional (por exemplo, um servidor Daetabase ou algum middleware) seguindo o princípio do beijo. Mas é claro que está longe de ser sexy ;-) e não usa a tecnologia correta da palavra da moda.

Outras dicas

A memória compartilhada não funcionará na Web (a menos que você execute a VPN) e não funciona bem na rede em geral (as visualizações podem ser dessincronizadas e você não pode sincronizá -las na rede).

Eu posso ver várias soluções para sua tarefa:

Opção 1. Use middleware orientado a mensagens (MOM), como MSMQ, KBMMW, nosso msgConnect para transmitir notificações que incluem apenas alterações nos seus dados. Dessa forma, os clientes não precisam pesquisar o servidor adicionalmente para instantâneos de dados. Todas as soluções MOM usam conexões TCP para operações e isso é mais confiável que as lotes de correio.

Opção 2. Use alguns DBMs do cliente-servidor, provavelmente o que suporta notificações para os clientes (não sou especialista em DMBs, para que não possa lhe contar os nomes).

Você pode usar um banco de dados como DBISAM, Firebird, etc. Com o DBISAM, usei um truque de ler os 8 primeiros bytes do arquivo de banco de dados que parece ser um cabeçalho. Se mudar, eu sei que os dados da tabela foram alterados, caso contrário, não mudou. Você pode utilizá -lo no cliente se usar um loop de votação ou se deseja continuar usando as lotes de correio como um método de notificação. ou seja, pesquise o arquivo a cada 10 segundos ou mediante notificação por correio, o que ocorrer primeiro.

O que há de errado em usar o TCP/IP? Você pode usar Indy (navios com Delphi já) ou ICS Para que seu aplicativo principal (mestre) responda às solicitações de IP (por exemplo, HTTP ou ICMP ou o que for adequado às suas necessidades de dados) com um tópico ou dois, e tenha os aplicativos "escravos", apenas solicite os dados através do endereço IP do Mestre em uma porta específica. Isso funcionaria em uma intranet ou através da Internet de forma transparente.

Usamos o MSMQ para algo semelhante.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top