Domanda

Ho un'applicazione Delphi 2006 che raccoglie i dati e li visualizza come una sintesi di molti canali, un canale per ogni riga su un TDrawGrid. Ho la stessa applicazione in esecuzione su vari altri PC della rete, ma questi altri del PC sono schiavi - non raccolgono i dati, ma semplicemente fornire un display remoto del riepilogo

.

Al momento, gli schiavi mostrano solo una mimica dello schermo di visualizzazione di riepilogo sul master, e questo avviene tramite trasmissioni a titolo di mailslots dal master.

Voglio realizzare questo in un modo diverso, per ridurre il carico sul master, e fornire gli schiavi con un po 'più di flessibilità e indipendenza su come interpretare i dati. Inoltre, sto avendo problemi con slot di caricamento di trasmissione dei dati tra sottoreti.

Posso utilizzare uno schema di memoria condivisa per porre i dati fino a un file mappato in memoria dove gli schiavi possono avere accesso da qualsiasi luogo (attraverso il web, anche)? Stiamo parlando di una dimensione della memoria di 100k byte max, diciamo, aggiornato dal maestro a circa una volta al secondo, probabilmente in un thread, per mantenere il task master di primo piano reattivo.

È stato utile?

Soluzione

Il modo più semplice utilizza un file in una condivisione che il maestro scrive e gli schiavi di sola lettura. Una specie di sincronizzazione potrebbe essere necessario, se si vuole evitare che "letture sporche". D'altra parte, non potrebbe importa, a seconda del tipo di dati che si desidera visualizzare.

Utilizzando un semplice file ha il vantaggio che non richiede alcun software aggiuntivo (per esempio un daetabase server o un po 'di middleware) seguendo il principio KISS. Ma, naturalmente, è tutt'altro che sexy ;-) e non usa la tecnologia di parola d'ordine corretta.

Altri suggerimenti

di memoria condivisa non funziona su web (a meno che non si esegue VPN) e non funziona bene sulla rete in generale (viste possono essere desincronizzato e non è possibile sincronizzare tutta la rete).

posso vedere diverse soluzioni per il vostro compito:

Opzione 1. middleware Usa orientato ai messaggi (MOM), come ad esempio MSMQ, kbmMW, la nostra MsgConnect alle notifiche di trasmissione che includono cambia solo nei dati. In questo modo i clienti non avrà bisogno di interrogare il server in aggiunta, per snapshot dei dati. Tutte le soluzioni MOM utilizzano connessioni TCP per le operazioni e questo è più affidabile di mailslot.

Opzione 2. Usare alcuni DBMS client-server, probabilmente quella che supporta le notifiche ai clienti (io non sono un esperto in DMBS quindi non posso dirvi i nomi).

Si potrebbe utilizzare un database come DBISAM, Firebird, ecc .. Con DBISAM, ho usato un trucco di leggere i primi 8 byte del file di database che sembra essere un colpo di testa. Se cambia, so che i dati nella tabella è cambiato, altrimenti non ha. È possibile utilizzare questo nel client se si utilizza un ciclo di polling, o se si desidera continuare a utilizzare le mailslot come un metodo di notifica. vale a dire il polling del file ogni 10 secondi o al momento della notifica slot di caricamento, quello che viene prima.

Cosa c'è di sbagliato con l'utilizzo di TCP / IP? È possibile utilizzare Indy (fornito con Delphi già) o ICS di avere il vostro principale (master) app rispondere alle richieste IP (ad es., HTTP o ICMP o qualsiasi altra cosa si adatta alle vostre esigenze per i dati) con un filo o due, e hanno il "slave" apps solo richiedere i dati tramite l'indirizzo IP del master su una porta specifica. Questo dovrebbe funzionare su una rete intranet o via Internet in modo trasparente.

Usiamo MSMQ per qualcosa di simile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top