[VB2005] Dati continui e refresh Controlli

martedì 17 gennaio 2012 - 10.51
Tag Elenco Tags  VB.NET  |  .NET 2.0  |  Visual Studio 2005  |  SQL Server 2005

mmjc23 Profilo | Newbie

Salve a tutti
Non sono molto esperto in Thread e quant'altro e chiedo il Vs. aiuto

Sto lavorando su una applicazione già funzionante e consolidata che, a causa dell'aumento dei dati ricevuti comincia a soffrire non poco.
Si tratta di una applicazione che gestisce il traffico ricevuto dai mezzi esterni sul territorio e li visualizza in tempo reale sulla mappa.
In sostanza, l'applicazione Server riceve i dati che vengono passati all'applicazione client la quale è divisa in due moduli: la parte "Traffico" che visualizza i dati ricevuti e "N" form "Mappa" che visualizzano le posizioni sulle "N" diverse mappe aperte.

Alla ricezione di ogni singola posizione, quindi, il Client, che deve mantenere tutto aggiornato in tempo "reale", deve:
-Aggiornare il listato del modulo traffico
-Aggiornare la Listview dell'elenco dei mezzi del modulo traffico per visualizzare le info aggiornate
-Aggiornare la Listview dell'elenco dei mezzi del modulo mappa per ognuna delle mappe aperte
-Aggiornare la posizione del veicolo sulla mappa per ogni mappa aperta.

Il tutto sembra funzionare...il problema è che adesso, ricevendo una posizione al secondo, ho grosse difficoltà ad aggiornare la mappa (anche se ce n'è solo una aperta), nel senso che il tutto funziona, ma non fa a tempo a smaltire le posizioni che gli arrivano e che quindi si accodano per essere smaltite piano piano ma nel frattempo l'interfaccia grafica rimane bloccata.
Esiste qualche modo per velocizzare il tutto? Oppure avete qualche consiglio su come rivedere eventualmente la logica dell'applicazione?
Avevo pensato al "Backgroundworker" (che non conosco) ma se chiamo un "Backgroundworker" ad ogni ricezione di posizione ed il precedente non ha finito ho paura di avere problemi.

Grazie

Jeremy Profilo | Guru

Ciao Matteo.
L'idea di lavorare in MultiThreading, a mio parere, è corretta .... magari non con il BackGroundWorker, ma con un thread separato vero e proprio.
Per sincronizzare le varie operazioni puoi utilizzare dei semafori(prova a fare una ricerca in merito).
Dirti di più senza maggiori dettagli è difficile.

Facci sapere...
Ciao

mmjc23 Profilo | Newbie

Riprendo questo post...(e ringrazio Jeremy per la risposta)
Ho letto un po' Online ma c'ho capito un po' poco di thread legati al form.
Cerco di semplificare un po' la questione...

Mettiamo di vedere la mia applicazione come costituita essenzialmente da due parti.
La parte principale, (parte all'avvio) la chiamerò "TRAFFICO", ed è quella che gestisce tutto il traffico ricevuto dal Server, lo visualizza in una Listview, aggiorna la Listview degli apparati ed inoltra(in caso di posizioni GPS) il traffico al Modulo Mappa.

La parte secondaria, la chiamerò "MAPPE", ed è appunto quella che riceve le posizioni dalla "TRAFFICO", aggiorna la propria ListView ed aggiorna le posizioni sulla Mappa. La "MAPPE", è costituita essenzialmente da un FORM al cui interno vengono caricati diversi UserControl Mappa (uno per ogni mappa aperta) gestiti mediante un controllo Olvio che mi consente di gestire i diversi Form Mappa aperti su schede diverse nello stesso form.

Per cominciare, vorrei che ognuno di questi UserControl Mappa (che poi sono essenzialmente dei Form), venga gestito in un Form separato così che, nel mentre aggiorno le posizioni sulle diverse mappe, non mi si blocchi la parte grafica di "TRAFFICO" (e delle altre mappe aperte)

Ovviamente, la parte "TRAFFICO" deve poter scambiare dati con la parte "MAPPE" e viceversa.
Ricordo che quando il mio collega aveva sviluppato l'applicazione, mi diceva che la parte grafica, non può essere gestita da un thread diverso da quello principale....in questo caso, quello che vorrei fare, non possibile...ma leggendo un po' Online, sembra che non sia proprio così ma non ho capito come si fa.

Grazie ancora

b4p3p Profilo | Newbie

salve,
il fatto che un thread non possa aggiornare un'altra finestra è parzialmente vero.
puoi aggirare questo limite utilizzando i dispatcher e i delegate.
se hai più mappe da aggiornare, o crei n thread per n mappe, oppure ne crei uno che vada ad aggiornare una mappa per volta. ( magari dai priorità massima alla mappa che l'utente sta visualizzando in quel momento)

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5