|
 |
|
| Visual Basic.NET |
« Precedente :: Successivo » |
| Autore |
Messaggio
|
| DaveDevil |
Inviato: Dom Dic 28, 2008 3:12 am Oggetto: Visual Basic.NET |
|
|

Registrato: 07/01/07 02:34
Messaggi: 1372 Residenza: Casa mia (Veggiano)
|
Ho un problemino di programmazione:
Ho un programma, che chiamerò MASTER e vari altri detti SLAVE completamente indipendendi (non sono compilati insieme).
Il primo programma ha delle variabili, che io voglio che vengano recepite anche dai programmi detti slave.
per esempio, dal programma MASTER modifico la variabile "colore", voglio che gli altri programmi si accorgano di questa modifica...
ho provato utilizzando i socket, creando una connessione TCP tra il master e gli slave, ma la cosa è pesantissima per il computer.
ora sto facendo una prova utilizzando una DLL come "botte di variabili" e facendo in modo che i programmi vi accedano, ma da quel che vedo ogni programma si crea una sua istanza della DLL, e quindi le modifiche del MASTER è come se non fossero mai state fatte per gli SLAVE.
premetto che la mia "ampia" conoscenza di Basic.NET proviene prevalentemente da forum, guide ecc...
probabilmente esiste qualche "trucco" di cui io sono all'oscuro...
qualcuno riesce a darmi una mano?!? _________________
FdO: Ma le sembra il modo di correre?
Dave: Non sto correndo troppo forte, sto volando troppo piano! |
|
| Top |
|
 |
Sponsor
|
|
 |
| r3lative |
Inviato: Dom Dic 28, 2008 3:43 am Oggetto: |
|
|
 BANNATO
Registrato: 03/05/07 00:27
Messaggi: 7340 Residenza: Saccolongo - PD - ITALY - terzo pianeta a sinistra
|
premesso che vb* nelle varie interpretazioni lo evito come la peste....
se i programmi sono indipendenti, in genere si usano dei file (txt o ini) oppure scrivi sul registry.
ovviamente molto dipende dalla frequenza con cui devi scrivere/leggere.
se si tratta (come spero) di parametri di funzionamento che vengono scritti una tantum e vengono letti dai programmi per inizializzare il programma stesso, allora la cosa più semplice è appunto un file o il registry.
se invece si tratta di comunicazioni tra i programmi, allora la strada del socket tcp o i programmi che usano l'exe come dll, ma dipende da cosa si puo fare e tu sai fare con vb. _________________ “Mai argomentare con un idiota;
ti fa scendere al suo livello e ti batte per esperienza ”
r3lative blog |
|
| Top |
|
 |
| dev/null |
Inviato: Dom Dic 28, 2008 11:13 am Oggetto: |
|
|

Registrato: 13/09/07 16:33 Età: 22 Messaggi: 1091 Residenza: JN55VL
|
Non conosco bene VB (lo odio pure io ) e non ho mai usato le DLL, però ti posso dire che la condivisione di risorse tra più processi è in genere regolata dal sistema operativo, sia perché per accedere a risorse condivise sono necessari meccanismi di arbitraggio, sia perché hai bisogno di primitive che risultino atomiche.
Scrivere su file per comunicare non è una cosa che mi piace come concetto... e credo comporti meno overhead una comunicazione con protocolli di rete tra i programmi chiamati in causa.
O altrimenti cerca cosa mette a disposizione Windows per la programmazione interprocesso... _________________ The ideas of economists and political philosophers, both when they are right and when they are wrong, are more powerful than is commonly understood. Indeed the world is ruled by little else. Practical men, who believe themselves to be quite exempt from any intellectual influence, are usually the slaves of some defunct economist. Madmen in authority, who hear voices in the air, are distilling their frenzy from some academic scribbler of a few years back. I am sure that the power of vested interests is vastly exaggerated compared with the gradual encroachment of ideas. -- J.M. Keynes |
|
| Top |
|
 |
| r3lative |
Inviato: Dom Dic 28, 2008 12:50 pm Oggetto: |
|
|
 BANNATO
Registrato: 03/05/07 00:27
Messaggi: 7340 Residenza: Saccolongo - PD - ITALY - terzo pianeta a sinistra
|
depende sempre da quello che devi fare.
se devi condividere solo alcuni parametri di inzializzazione e configurazione del programma, il file o il registry vanno benissimo (scrivi 1 volta, leggi all'apertura, memorizzi, e chiudi).
se invece devi stabilire comunicazioni "intensive" tra i vari programmi, allora socket o dll, o altre strutture, in base alle conoscenze ed esigenze.
ho spesso visto usare cannoni per sparare a mosche ... diamoci la misura
un po come quelli che usano oracle per memorizzare i dati dell'agenda, o sqlserver per memorizzare le liste mp3 dei 50 CD e 12 film ....
ciao
ps il primo l'ho visto sul serio
i secondi, sono molto, ma molto diffusi ... _________________ “Mai argomentare con un idiota;
ti fa scendere al suo livello e ti batte per esperienza ”
r3lative blog |
|
| Top |
|
 |
| DaveDevil |
Inviato: Dom Dic 28, 2008 10:51 pm Oggetto: |
|
|

Registrato: 07/01/07 02:34
Messaggi: 1372 Residenza: Casa mia (Veggiano)
|
beh, la quantità di dati è elevata, e sopratutto variabile molto frequentemente.
utilizzando i socket ho già provato, purtroppo la connessione di più programmi via TCP al programma principale, fa si che vengano occupate troppe risorse...
vorrei sapere qualcosa in più per le DLL.
ho creato una dll con una decina di variabili. Accedendo con il programma server, riesco a modificare il valore di ciascuna variabile, modifica che però non viene minimamente vista dagli altri programmi che vanno a leggere la stessa dll...
presumo che ogni programma si crea al momento dell'avvio una propria istanza della dll! _________________
FdO: Ma le sembra il modo di correre?
Dave: Non sto correndo troppo forte, sto volando troppo piano! |
|
| Top |
|
 |
| dev/null |
Inviato: Lun Dic 29, 2008 1:25 am Oggetto: |
|
|

Registrato: 13/09/07 16:33 Età: 22 Messaggi: 1091 Residenza: JN55VL
|
Chiaro, perché ogni programma ha il proprio segmento di memoria. Non so però come venga gestito il caricamento delle DLL e né come si acceda alle risorse di una DLL, però è normale che di default non venga condiviso nulla.
Le condivisioni di risorse e le comunicazioni tra processi sono gestite dal sistema operativo (e non potrebbe essere altrimenti), che mette a disposizione degli strumenti: in Linux/Unix ci sono le IPC, in Windows non ti so dire, qualcosa ci sarà.
A me pare comunque strano che una comunicazione TCP occupi troppe risorse, più che altro perché il throughput richiesto mi sembra irrisorio... ho avuto a che fare con programmi che scambiavano dati via TCP un centinaio di volte al secondo... e sicuramente non era un granché come prestazione.
Ma crei una nuova connessione ogni volta che i programmi devono comunicare oppure usi sempre la stessa?
P.S.: leggo su Wikipedia che le DLL vengono caricate nel segmento di memoria del processo che le usa, quindi ogni processo se la carica e accede al proprio orticello.  _________________ The ideas of economists and political philosophers, both when they are right and when they are wrong, are more powerful than is commonly understood. Indeed the world is ruled by little else. Practical men, who believe themselves to be quite exempt from any intellectual influence, are usually the slaves of some defunct economist. Madmen in authority, who hear voices in the air, are distilling their frenzy from some academic scribbler of a few years back. I am sure that the power of vested interests is vastly exaggerated compared with the gradual encroachment of ideas. -- J.M. Keynes |
|
| Top |
|
 |
| r3lative |
Inviato: Lun Dic 29, 2008 1:40 am Oggetto: |
|
|
 BANNATO
Registrato: 03/05/07 00:27
Messaggi: 7340 Residenza: Saccolongo - PD - ITALY - terzo pianeta a sinistra
|
consiglio... verifica di usare correttamente i socket ... in genere funzionano molto bene, sono leggeri e performanti.
ciao _________________ “Mai argomentare con un idiota;
ti fa scendere al suo livello e ti batte per esperienza ”
r3lative blog |
|
| Top |
|
 |
| DaveDevil |
Inviato: Lun Dic 29, 2008 3:00 am Oggetto: |
|
|

Registrato: 07/01/07 02:34
Messaggi: 1372 Residenza: Casa mia (Veggiano)
|
| r3lative ha scritto: | consiglio... verifica di usare correttamente i socket ... in genere funzionano molto bene, sono leggeri e performanti.
ciao |
dato che non esistono metodi particolari...
il programma master usa il listener, che ogni secondo accetta le eventuali richieste di connessione (polling).
poi, spara via tcp a chiunque sia connesso una infinità di dati (tramite stringa).
il problema sorge quando utilizzo più di un programma per la ricezione: va in timeout e tenta di riconnettersi (perchè se entro X tempo non ricevo almeno Y caratteri, per me la connessione è interrotta).
il problema è che il client utilizza circa (da task manager) il 10 % della cpu! _________________
FdO: Ma le sembra il modo di correre?
Dave: Non sto correndo troppo forte, sto volando troppo piano! |
|
| Top |
|
 |
| r3lative |
Inviato: Lun Dic 29, 2008 4:29 am Oggetto: |
|
|
 BANNATO
Registrato: 03/05/07 00:27
Messaggi: 7340 Residenza: Saccolongo - PD - ITALY - terzo pianeta a sinistra
|
premesso che non conosco vb.net, e quindi non so come gestisce i socket ...
io (con delphi, ma la cosa è analoga a tutti i linguaggi su cui ho messo mano) non definisco un polling per l'ascolto della porta tcp/ip, ma definisco degli eventi, ovvero quando sulla porta XYZ arrivano dati, viene eseguito il tale evento, che riceve la stringa di dati, e la gestisce in qualche modo.
il fatto di usare polling, mi fa sorgere il dubbio che in realta tu non gestisca il socket, ma un qualcosa che ingloba il socket, e che gestisce a più alto livello la comunicazione.
tieni presente che tutti i miei programmi hanno una porta di controllo tcp/ip che comunica agli altri pc lo scatenarsi di determinati eventi (tipo chiusura forzata del programma, invio di msg, avvisi di aggiornamenti, ecc)
l'occupazione di cpu è 0, mentre è in attesa, in fase di gestione, ovviamente dipende da cosa deve fare (visualizzare un msg a video, è molto diverso da scaricare dei log, o forzare la chiusura del programma con relativi controlli e chiusure di db, ecc)
i problemi tipici delle comunicazioni di questo tipo sono i memory leak, i tempi (sequenze, time-out, ecc) e gestione del protocollo di scambio dati... per il resto non ho mai avuto particolari problemi ...
PS
rileggendo meglio, tu dici che da un singolo programma, vuoi inviare dati a n altri programmi. ok, ovviamente ogni altro programma deve avere una porta d'ascolto diversa (dato che sei sullo stesso pc) ed inoltre il programma che invia deve avere una lista dei programmi/porte a cui trasmettere.
es
server porta 10000
client1 porta 10001
client2 porta 10002,
ecc
porte sempre superiori alla 1024 (e anche qualcosa in più ), mi raccomando _________________ “Mai argomentare con un idiota;
ti fa scendere al suo livello e ti batte per esperienza ”
r3lative blog |
|
| Top |
|
 |
| krakatoa |
Inviato: Mar Dic 30, 2008 10:45 am Oggetto: |
|
|
Registrato: 05/09/07 20:12 Età: 25 Messaggi: 118
|
| Se le informazioni che devi passare non sono complesse o particolari, prova con le classiche variabili d'ambiente di windows.... |
|
| Top |
|
 |
| DaveDevil |
Inviato: Mar Dic 30, 2008 8:36 pm Oggetto: |
|
|

Registrato: 07/01/07 02:34
Messaggi: 1372 Residenza: Casa mia (Veggiano)
|
| krakatoa ha scritto: | | Se le informazioni che devi passare non sono complesse o particolari, prova con le classiche variabili d'ambiente di windows.... |
???
devo passare molti dati, ma sono tutti o interi cha vanno da 0 a qualche migliaio, o numeri con doppio decimale...
in ogni caso, non mi è possibile creare più porte di ascolto nel programma server, in quanto la creazione dei client voglio che sia completamente estranea a tutto il resto. facendo come dici, utilizzando varie porte, dovrei ricordarmi nell'ultimo programma quale porta è stata usata, ed incrementarla... _________________
FdO: Ma le sembra il modo di correre?
Dave: Non sto correndo troppo forte, sto volando troppo piano! |
|
| Top |
|
 |
| r3lative |
Inviato: Mar Dic 30, 2008 9:02 pm Oggetto: |
|
|
 BANNATO
Registrato: 03/05/07 00:27
Messaggi: 7340 Residenza: Saccolongo - PD - ITALY - terzo pianeta a sinistra
|
| DaveDevil ha scritto: | | in ogni caso, non mi è possibile creare più porte di ascolto nel programma server, in quanto la creazione dei client voglio che sia completamente estranea a tutto il resto. facendo come dici, utilizzando varie porte, dovrei ricordarmi nell'ultimo programma quale porta è stata usata, ed incrementarla... |
???
il server ha una porta (10000) aperta, e si connette agli altri client tramite le loro porte, ovvero si connette a "client1 = localhost:10001", "client 2 = localhost:10002", ecc facendo una scansione
non puoi avere più programmi in ascolto tutti sulla stessa porta (dello stesso pc), mentre è vero il viceversa, ovvero più programmi che si connettono alla stessa porta.
la porta che apri in uscita, è selezionabile e non è necessariamente la stessa (anzi, di solito non lo è mai) a cui devi connetterti.
in soldoni...
da server (in ascolto sulla porta 10000, ma potrebbe anche essere chiusa, in quanto non usata), ti connetti al client1 (in ascolto sulla porta 10001) usando la porta 32643 (random, di solito i socket lo possono gestire in automatico, oppure la assegni tu pensandoci un attimo) in uscita, ecc
volendo (e sapendolo gestire, non è banale) potresti anche fare viceversa, un unica porta aperta (la 10000) sul server, e tutti i client si connettono a quella porta, poi da server fai la scansione dei client collegati e invi loro i dati. attenzione che in questo caso le cose sono un po più difficili da gestire _________________ “Mai argomentare con un idiota;
ti fa scendere al suo livello e ti batte per esperienza ”
r3lative blog |
|
| Top |
|
 |
|
|
|
 |
|
Pagina 1 di 1 |
|
Non puoi inserire nuovi argomenti Non puoi rispondere a nessun argomento Non puoi modificare i tuoi messaggi Non puoi cancellare i tuoi messaggi Non puoi votare nei sondaggi
|
|
|
|