Un altro aiutino sui threads

giovedì 12 gennaio 2012 - 19.47
Tag Elenco Tags  C#

82_marco Profilo | Junior Member

Ciao a tutti,

sto cercando di creare un thread, ma non riesco a capire come si creano.

ho composto questo codice:



//avvio la lettura su un altro thread:
public delegate void Aggiorna1(string a);
private void Calcoloprotocollo()
{
int a = 0;
while (true)
{
a++;
// Thread.Sleep(100);
// label3.Text = a.ToString();
this.Invoke(new Aggiorna1(_Aggiorna1));
}
}


private void _Aggiorna1(string a)
{
label3.Text = a;
}

dovrebbe visualizare sulla label il valore di a che si incrementa ma come al solito sbaglio qualcosa :-(

E se dovessi confrontare il valore in un altro thread che gira assieme a questo?

Jeremy Profilo | Guru

Ciao Marco
//avvio la lettura su un altro thread: public delegate void Aggiorna1(string a); private void Calcoloprotocollo() { int a = 0; while (true) { a++; // Thread.Sleep(100); // label3.Text = a.ToString(); this.Invoke(new Aggiorna1(_Aggiorna1),a.ToString()); //SBAGLIAVI QUI } } private void _Aggiorna1(string a) { label3.Text = a; }
>E se dovessi confrontare il valore in un altro thread che gira
>assieme a questo?
In che senso .... fai un esempio.

Facci sapere...
Ciao

82_marco Profilo | Junior Member

Cioe' se io ho un thread che mi legge dalla seriale (quello dell altro thread) e un altro che mi calcola come devono essere le uscite della scheda,
dovrei confrontare il valore di argvalue con quello calcolato dal secondo thread e se sono diversi eseguire un comando.
avrei pensato a un if goto sul primo thread. sbaglio?
volevo anche sapere come mai non funziona il codice che ho postato, non capisco come creare correttamente un thread

luigidibiasi Profilo | Guru

devi guardarti l'argomento "sincronizzazione dei thread" su msdn...

se vuoi spiega in dettaglio cosa vuoi fare...
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

allora avevo pensato di fare cosi:

public delegate void Aggiorna(string argValue); private void _Leggi() { while (true) { sp.Write(">erFF??!"); byte[] ByteLetti = new byte[1]; if (sp.BytesToRead > 0) { Array.Resize(ref ByteLetti, sp.BytesToRead); sp.Read(ByteLetti, 0, ByteLetti.Length); s_ricevi = System.Text.Encoding.ASCII.GetString(ByteLetti); this.Invoke(new Aggiorna(_Aggiorna), s_ricevi); this.Invoke(new Aggiorna(stato), s_ricevi); } Thread.Sleep(100); } }

questo thread invia il protocollo di lettura: ">erFF??!" dove il carattere "e" indica che viene interrogata la scheda numero 1, se si vuole interrogare la 2 sara': ">frFF??!".
come risposta, su argvalue ho un protocollo del tipo: <e000000AAAAAA000007 che contiene llo stato degli ingressi e delle uscite della scheda.

volevo aggiungere un thread che contiene questo codice:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

che calcola il valore delle uscite (ODhex) di una scheda dica all altro thread di inviare al posto del solito protocollo il valore di protscritt in caso che questo sia diverso dallo stato delle uscite della scheda.

Premetto che non so quante schede ci sono, al massimo ce ne sono 256 (questo lo comunichero' al software con un file di configurazione da leggere ad ogni avvio di programma.

- e' fattibile il mio pensiero o devo fare in modo diverso?
- non ho tnta dimestichezza con i thread, se e' fattibile potreste darmi un aiutino? magari gudandomi
- secondo voi e' meglio usare lo stesso thread (il secondo) per tutte le schede (modificando "indasc") o e' meglio creare un thread per ogni scheda?

Vi ringrazio per l' aiuto che mi darete

luigidibiasi Profilo | Guru

scusami chiariscimi un'altra cosa:

tu hai uno stream (presumo una seriale) sulla quale invii quella stringa per interrogare una scheda... poi attendi che dalla seriale ti arrivano i dati in cui sono scritti gli stati delle porte sulla scheda interrogata...

fin qui ho capito bene?

se si... non scrivermi il codice ma dimmi cosa vuoi far fare all'altro thread?
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

Giusto Luigi.... sull altro thread vorrei preparare il protocollo relativo allo stato delle uscite di tutte le schede al momento della lettura di una scheda ( vedro' dopo come fare per dire che uscita deve andare alta e come) per poi andarlo a scrivere al suo turno (dopo confronto con lo stato letto e lo stato calcolato di una determinata scheda)... spero di essere riuscito a spiegarmi

luigidibiasi Profilo | Guru

allora quello che vuoi fare mi è chiaro... però non capisco perché vuoi farlo in un thread separato...
da come ho visto richiesta e risposta dalla scheda avvengono serialmente infatti fai una write e subito dopo una read...

ci mette molto tempo a rispondere ogni scheda col proprio stato?


Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

Ciao, la risposta e' instantanea.

Non volevo gestire domanda e risposta in thread separati, ma farli sullo stesso come adesso.
in un altro thread volevo mettere un codice che ogni volta che lo stato delle uscite della scheda cambia (le uscite le comando io tramite dei pulsanti per adesso, poi dovro' costruire un codice che lo faccia confrontando gli stati di tutte le schede) lui se ne accorga, interrompa l'interrogazione, invii il comando da fare attuare alla scheda e poi riprenda l'interrogazione da dove era rimasto.
Per il momento decido lo stato delle schede con questo codice:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

il valore di DO1..8 lo assegno tramite pulsanti per adesso, ci saranno tanti protscritt quante saranno le schede (il nome della scheda da comandare e' sul parametro indasc che assumera' il valore: e,f,g,h, ecc).
Or il mio problema e' dove mettere questo codice, COme fare se c'e' piu di una scheda e come fare ad interrompere l'interrogazione per inviare protscritt.

E' difficile da spiegare ma spero di essere stato esauriente

luigidibiasi Profilo | Guru

si adesso è tutto chiaro... (spero... vuoi gestire una sorta di interrupt ogni volta che premi un pulsante)

(ti dico subito che il fatto di non usare thread equivale ad un pooling delle schede... o modalità PIO quindi non è un male se non li usi )

allora:

dato che la lettura è sequenziale (ti accorgi dopo aver interrogato che lo stato di una scheda è cambiata) avere due thread è solo una complicanza poiché anche se credi di fare le due operazioni in modo concorrente in realtà vengono eseguite sempre in modo sequenziale (se usi una sola seriale [che ti fa capire che stai operando in modo sequenziale]...) :

verrebbe una cosa del tipo

THREAD1:
1) interrogo scheda 1
2) leggo valore 1
x) ****
3) interrogo scheda 2
4) leggo valore 2

THREAD 2
ad ogni passo se valore corrente = ..... allora ...

il problema è che tu hai a disposizione il valore corrente della scheda solo dopo che il thread 1 la ha letta ... e quindi il thread 2 partirebbe in modo sequenziale al thread 1 per ogni scheda... forse sono stato contorto ma in realtà anche se fai due thread e come se ne fosse uno solo (proprio perché interroghi le schede in modo sequenziale)...

se ci pensi... per inviare un comando dopo aver letto lo stato di una scheda devi comunque bloccare l'interrogazione del thread1 poiché sei su una seriale e non puoi inviare due comandi in parallelo... (o leggere e scrivere in parallelo)

detto questo (e spero di aver capito bene il tuo problema) dove ho messo x) ***** puoi inserire il codice che ti richiama la routine che volevi far eseguire al thread2 e in base al valore dello stato della scheda appena letta inviare il comando apposito...

non credo tu abbia bisogno dei thread...

se poi vuoi comunque usarli ti descrivo una possibile soluzione ... però aspetto prima di capire se sei convinto :)
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

Piu' o meno ci siamo

dovrebbe essere cosi

1 interrogo scheda 1
2 leggo scheda 1
3 vedo se ad un a delle n schede visto lo stato della scheda 1 devo modificare lo stato delle uscite
4 se devo modificare una scheda scrivo l protocollo di comando e poi torno al punto 1 interrogando la scheda 2, altrimenti torno subito al punto 1 interrogando la scheda 2

e cosi via

luigidibiasi Profilo | Guru

quindi non devi usare il secondo thread... ti basta richiamare quella funzione di confronto stati direttamente dopo ogni ricezione di stato...
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

mi sa che ci siamo quasi...

82_marco Profilo | Junior Member

Devo vedere come rilevare una variazione in protscritt. in modo piu' elegante, adesso ho copiato protscritt in un altra varuiabile e poi dopo il calcolo faccio il confronto, per funzionare funziona, ma sicuramente non e' il modo migliore, qualcuno ha qualche idea su come farlo?

Il secondo problema che mi rimane e' che questo codice va bene per una scheda, ma se io collego n schede cosa mi consiglieresti di fare?

Grazie

luigidibiasi Profilo | Guru

cos'è che hai fatto esattamente?
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

Ho aggiunto il codice che calcola il protocollo che comanda le uscite al thread di lettura, per decidere se inviare in seriale un comando di scrittura o di lettura ho copiato il valore del protocollo calcolato in un altra variabile e lo confronto con quello del calcolo precedente, e' un po' difficile da spiegare, se vuoi ti mando il codice cosi mi dici come ti sembra.
Poi c'e' il problema di gestire tante schede (con una sembra funzionare bene, casomai se vedi qualcosa da migliorare me lo dici)

82_marco Profilo | Junior Member

Niente, non riesco a venire a capodi questi 2 problemi

luigidibiasi Profilo | Guru

bhe se ti va' allega il codice magari riusciamo a dargli uno sguardo
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

Grazie, ti allego il codice

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

vorrei rendere piu' elegante la parte di codice che confronta protscritt e capire come posso fare per gestire piu' schede, cioe' la lettura la faccio in modo sequenziale incrementando l' indirizzo, ma se ad esempio ho 10 schede, dovrei calcolare ad ogni lettura di una qualsiasi scheda, 10 protscritt, o sbaglio?

luigidibiasi Profilo | Guru

Ciao,
oggi do' uno sguardo al codice... dimmi una cosa ma quando parli di più schede come intendi collegarle al pc?
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

e' un bus rs485, sono tutte collegate alla stessa porta com attraverso un convertitore rs232/485.
per identificare quale scheda comandare se guardi il protocolla al secondo carattere c'e' una "e", quella e' l'indirizzo della scheda 1, per la 2 bisogna mettere "f" e cosi via....

82_marco Profilo | Junior Member

Ciao, visto il codice? cosa ne pensi?

luigidibiasi Profilo | Guru

scusami mi ero perso il thread
do' una occhiata ora
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

luigidibiasi Profilo | Guru

nel codice ho trovato un riferimento ad una variabile _aggiorna in una invoke ... però non riesco a capire dove la prendi (forse è una variabile globale?)
this.Invoke(new Aggiorna(_Aggiorna), s_ricevi);

comunque, il tuo problema ora è capire come modificare quel carattere per indicizzare la scheda giusto?


Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

Ciao, l'invoke serve per trattare i dati letti e poi visualizzarne il risultato in una textbox.

il mio problema e' gestire tante schede collegate assieme (credo che dovrei memorizzare i parametri di scrittura ogni scheda per poi trattarli e scriverli in seriale)
poi un altro problema e' se 2 schede cambiano stato assieme come faccio a dare una priorita' all invio in seriale?

luigidibiasi Profilo | Guru

>Ciao, l'invoke serve per trattare i dati letti e poi visualizzarne
>il risultato in una textbox.
>


>il mio problema e' gestire tante schede collegate assieme (credo
>che dovrei memorizzare i parametri di scrittura ogni scheda per
>poi trattarli e scriverli in seriale)
se ogni scheda ha associato un carattere basta che memorizzi tutti i caratteri in un array e poi scorri l'array

>poi un altro problema e' se 2 schede cambiano stato assieme come
>faccio a dare una priorita' all invio in seriale?
non è un problema perché tu interroghi una scheda alla volta (fai pooling) quindi rileverai i cambi ordinati in base a come interroghi tu...


Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

ma il cambio dello stato degli ingressi di una scheda puo' comportare il cambiamento dello stato degli stati delle scheda stessa ma anche di altre, in questo caso ci saranno piu' protocolli da creare ed inviare in seriale

luigidibiasi Profilo | Guru

>ma il cambio dello stato degli ingressi di una scheda puo' comportare
>il cambiamento dello stato degli stati delle scheda stessa ma
>anche di altre, in questo caso ci saranno piu' protocolli da
>creare ed inviare in seriale

scusa... tu puoi interrogare una sola scheda alla volta... (su questo non ci piove)
quindi puoi ricevere un solo stato alla volta... ora in base a quello stato usi un comando diverso a seconda di uno stato diverso?



Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

Ciao in base a quello stato andro' a creare dei protocolli che gestiranno altre schede o la scheda stessa
tipo: se l' ingresso 1 della scheda 2 e l'ingresso 5 della 5 sono alti allora mando alta l'uscita 4 della 8 e la 1 della 2 (La scrittura dei protocolli la faro' piu' avanti, adesso mi interesserebbe cpire come mi conviene agire per gestire le schede)

82_marco Profilo | Junior Member

Secondo me ogni scheda dovrebbe avere il suo protocollo di comando archiviato da qualche parte che verra' ripescato e modificato all occorrenza per poi essere inviato, in oltre dovrebbe avere anche un contatore per rilevare le comunicazioni non andate a buon fine.
cosa ne pensi?

luigidibiasi Profilo | Guru

>Secondo me ogni scheda dovrebbe avere il suo protocollo di comando
>archiviato da qualche parte che verra' ripescato e modificato
>all occorrenza per poi essere inviato, in oltre dovrebbe avere

>cosa ne pensi?
mi sto ingarbugliando :)


>Ciao in base a quello stato andro' a creare dei protocolli che gestiranno altre schede o la scheda stessa
>tipo: se l' ingresso 1 della scheda 2 e l'ingresso 5 della 5 sono alti allora mando alta l'uscita 4 della 8 e la 1 della 2 (La scrittura dei protocolli la faro' piu' avanti, >adesso mi interesserebbe cpire come mi conviene agire per gestire le schede)
devi gestire per ogni possibile stato (ogni stato è formato dal valore di più ingressi) una possibile stringa da inviare?
Perchè dall'esempio che mi fai devi prima leggere tutti gli stati di tutte le schede in modo da poter capire come procedere... giusto fin qui?

non mi è chiaro se una volta letto uno stato (e creato il protocollo per comandare le altre schede) hai necessità di seguire un ordine preciso su come comandarle (prima la 2, poi la 4, poi la 3) ...


Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

ciao,
- Nel codice che ho postato tramite dei pulsanti vado a vambiare il valore di DO1..DO8 e poi vado ad unirli e a calcolare il protocollo. appena risolto il problema di gestione di piu' schee vedro' come sostituire i pulsanti con una logica. comunque ogni scheda dovrebbe avere secondo me una stringa data dalla somma di tutti i DO, tipo DOscheda1 = D8+D7+D6+D5+D4+D3+D2+D1,poi una volta rilevato il cambiamento di un elemento di DOscheda1 bisogna salvarlo perche' nel caso la scheda vada fuori linea una volta rientrata alla lettura venga ripristinata, interrompere la lettura, passare al calcolo del protocollo da inviare, inviarlo e poi riprendere la lettura.

- Nel caso in cui cambino gli stati di piu' schede non ha importanza in che ordine comandarlo, tant oi tempi dovrebbero essere irrisori

E' un pochino complicato, o forse sono io che faccio confusione

Ti ringrazio dell' aiuto che mi stai dando

luigidibiasi Profilo | Guru

>ciao,
>- Nel codice che ho postato tramite dei pulsanti vado a vambiare
>il valore di DO1..DO8 e poi vado ad unirli e a calcolare il protocollo.
ok

>appena risolto il problema di gestione di piu' schee vedro' come
>sostituire i pulsanti con una logica.
ok anche fin qui... al momento facciamo finta che non ci siano i pulsanti anche perché a noi non interessa gli stati perché cambiano ma come cambiano.

>comunque ogni scheda dovrebbe
>avere secondo me una stringa data dalla somma di tutti i DO,
>tipo DOscheda1 = D8+D7+D6+D5+D4+D3+D2+D1,
un concatenamente dei valori giusto?
una somma potrebbe dare risultati uguali per combinazioni di stati diversi

>poi una volta rilevato

cambiamo metodo ?

fammi gli esempi delle varie modalità di funzionamento in cui il tuo sistema si può trovare (automa a stati finiti o diagramma degli stati) così togliamo tutte le ambiguità

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

>un concatenamente dei valori giusto?
si creo la stringa in questo modo:
string.Concat(DO8, DO7, DO6, DO5, DO4, DO3, DO2, DO1);

>fammi gli esempi delle varie modalità di funzionamento in cui
>il tuo sistema si può trovare (automa a stati finiti o diagramma
>degli stati) così togliamo tutte le ambiguità

Ti preparo un diagramma di flusso e poi lo posto

82_marco Profilo | Junior Member

Ciao ti allego il diagramma di flusso di come dovrebbe funzionare il software.
Cosa ne pensi?

Questa sera dovrei implementare una parte di coice dove dichiaro gli indirizzi delle schede collegato ed abilito la lettura solo di quelle

luigidibiasi Profilo | Guru

>Ciao ti allego il diagramma di flusso di come dovrebbe funzionare
>il software.
>Cosa ne pensi?

bhe da quello che vedo direi che i thread non devono essere proprio usati ... è tutto sequenziale... (te ne accorgi dal fatto che manca il simbolino di fork nel diagramma quindi non ci sono operazioni parallelizzabili)

andiamo passo passo:

1) interrogazione di tutte le schede configurate per mapparle: è una fase di inizializzazione delle schede oppure leggi da un file di configurazione quali schede dovrai poi usare? (dato che la fai solo una volta presumo sia inizializzazione)
===
2) lettura di una scheda : leggi la prima scheda in coda (o nella lista di schede da gestire). La chiamo H1
2) in base allo stato di H1 (che chiamo S1) cambi (se necessario) le uscite sulle altre schede (Hi, Hj, Hk)
3) controlli se S1 è noto (una sorta di IF nel codice... un IF per ogni stato che vuoi gestire)
3.a) se S1 è uno stato che non vuoi gestire (else?) "ripristina stato secondo quello calcolato??" e vai avanti
4) se S1 ha invece interessato altre schede invii i comandi di modifica alle schede interessate.
5) goto 2 (lettura della prossima scheda)
===

per come hai fatto lo schema direi che la lettura delle schede segue l'ordine H1, H2, H3 .... Hn e poi riparte da H1

è questo il comportamento che vuoi? se si direi che puoi implementare tutto senza problemi... però arrivato a questo punto devo richiederti che problema hai perché mi sono perso tra tutti i post che abbiamo scritto

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

Il problemi sono:
- come facio a tenere in memoria lo stato di una scheda per vedere se quello reale corrisponde a quello voluto?

- per calcolare il comando da dare alla scheda devo tenere in memoria lo stato di tutte le uscite della scheda perche' il protocollo di comando delle uscite richiede di inviare ogni volta lo stato di tutte le uscite e non solo di quelle da modificare, quindi dovrei memorizzare da qualche parte gli stati du tutte le schede, giusto?

luigidibiasi Profilo | Guru

>Il problemi sono:
>- come facio a tenere in memoria lo stato di una scheda per vedere
>se quello reale corrisponde a quello voluto?

usi un dizionario del tipo (IDScheda, VecchioValore) poi dopo ogni lettura lo confronti e sostituisci il vecchio valore con quello corrente per la prossima lettura
cioè una volta letto lo stato lo puoi mantenere nelle variabili... cosa mi perdo? perché non riesci a mantenerlo?

>
>- per calcolare il comando da dare alla scheda devo tenere in
>memoria lo stato di tutte le uscite della scheda perche' il protocollo
>di comando delle uscite richiede di inviare ogni volta lo stato
>di tutte le uscite e non solo di quelle da modificare, quindi
>dovrei memorizzare da qualche parte gli stati du tutte le schede,
>giusto?
si... ma ti vengono in aiuto gli array di array, i dictionary ci sono tante strutture che ti permettono di mantenere in memoria informazioni strutturate

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

>1) interrogazione di tutte le schede configurate per mapparle:
>è una fase di inizializzazione delle schede oppure leggi da un
>file di configurazione quali schede dovrai poi usare? (dato che
>la fai solo una volta presumo sia inizializzazione)

leggo in un file che schede devo utilizzare e poi appena partito il programma inizializzo lo stato delle schede in quel momento ( per evitare di dare comandi errati dovuti alla mancata lettura delle altre schede)

>2) lettura di una scheda : leggi la prima scheda in coda (o nella
>lista di schede da gestire). La chiamo H1

si, la prima della lista

>2) in base allo stato di H1 (che chiamo S1) cambi (se necessario)
>le uscite sulle altre schede (Hi, Hj, Hk)

anche quelle di H1

>3) controlli se S1 è noto (una sorta di IF nel codice... un IF
>per ogni stato che vuoi gestire)

noto?

>3.a) se S1 è uno stato che non vuoi gestire (else?) "ripristina
>stato secondo quello calcolato??" e vai avanti

se a causa di un errore di comunicazione la scheda non prende il comando, al ripristino della comunicazione lo stato non corrisponderebbe a quello voluto, quindi alla lettura bisognerebbe ripristinarlo

>4) se S1 ha invece interessato altre schede invii i comandi di
>modifica alle schede interessate.

si, come faccio dare la precedenza?

>5) goto 2 (lettura della prossima scheda)

si
>===
>
>per come hai fatto lo schema direi che la lettura delle schede
>segue l'ordine H1, H2, H3 .... Hn e poi riparte da H1
>
>è questo il comportamento che vuoi? se si direi che puoi implementare

si


82_marco Profilo | Junior Member

non ho mai usato queste funzioni

82_marco Profilo | Junior Member

>usi un dizionario del tipo (IDScheda, VecchioValore) poi dopo
>ogni lettura lo confronti e sostituisci il vecchio valore con
>quello corrente per la prossima lettura

>si... ma ti vengono in aiuto gli array di array, i dictionary
>ci sono tante strutture che ti permettono di mantenere in memoria
>informazioni strutturate


hai qualche esempio da propormi?

luigidibiasi Profilo | Guru

si, entro domani pomeriggio ti posto qualche esempio
scusami se non riesco ora ma non ho strumenti a portata di dita :)
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

Tranquillo, grazie

Io vedo se questa sera, problemi personali permettendo riesco a implementare l' indicazione delle schede collegate e la visualizzazione dello stato delle schede su una richtextbox

82_marco Profilo | Junior Member

Ciao, sono riuscito a finire l' implementazione della scrittura sulla richtextbox, pero' mi sono accorto di alcuni bachi da correggere

luigidibiasi Profilo | Guru

>>usi un dizionario del tipo (IDScheda, VecchioValore) poi dopo
>>ogni lettura lo confronti e sostituisci il vecchio valore con
>>quello corrente per la prossima lettura
>
>>si... ma ti vengono in aiuto gli array di array, i dictionary
>>ci sono tante strutture che ti permettono di mantenere in memoria
>>informazioni strutturate
>
>
>hai qualche esempio da propormi?
>
ciao,
scusami che tipo di esempio ti interessa? mantenimento di informazioni nel dictionary?

un esempio base è http://www.dotnetperls.com/dictionary-vbnet

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

ciao non sono ancora riuscito a vedere l' esempio, sono bloccato con un problema con la seriale:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

quando scollego la scheda vorrei che s_ricevi perda il valore acquisito, in modo che io possa cancellare la label dove vedo il suo contenuto

luigidibiasi Profilo | Guru

bhe con la seriale non so se puoi mettere un timeout alla lettura (scaduto il quale pulisci)...
magari puoi implementarti un contantore che dopo X secondi che non ricevi più nulla toglie il valore dalla label...
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

in fatti volevo rilevare la mancanza di ricezione e tramite un ciclo if pulire la riga, ma non riesco a rilevare la condizione a te viene in mente qualcosa?

82_marco Profilo | Junior Member

Ciao ,

ho un problema riguardante i dizionari: non riesco a capire come inizializzarli: ho x schede con un numero variabile di volta in volta che uso il programma e nei dizionari vorrei inserire per ogni indice lo stato delle uscite e il numero degli errori di comunicaizone di ogni scheda

luigidibiasi Profilo | Guru

Devi creare il dizionario quando leggi il file di configurazione e nel "value" del dizionario devi gestire un oggetto che ti mantiene lo stato della scheda

ad esempio:

class SchedaHW
{
int stato;
string uscite;
}

il dizionario lo fai come Dictionary(Of int,SchedaHW) ovvero un dizionario con chiave intera (l'index della scheda) e l'oggetto Scheda che ti rappresenta lo stato della scheda stessa
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

Ciao, purtroppo non ho il mio pc sotto mano per provare :-(

82_marco Profilo | Junior Member

Ciao sto provando i dizionari, :-) spero di riuscire preso a fare le ultime prove :-)

esiste un comando che nel caso uno o piu' schede cambino stato mi restituisca l'indice delle schede e il loro contenuto?

82_marco Profilo | Junior Member

Ciao ho creato i dizionari in questo modo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

e poi al calcolo dello stato delle uscite seguito alla lettura, vado ad implementare il dizionario:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ora il problema e' questo: se a seguito lettura lo stato di una o piu' schede cambia, quindi lo vado ad aggiornare sul dizionario, in che modo potrei accorgermi della variazione per poterla usare in questo comando: ?

comandoperiferiche(numperiferica, uscitedigitali);

Dove numperiferica, sarebbe l'indice del dizionario e uscitedigitali sarebbe il contenuto del dizionario dove e' variato il contenuto (mi interessa solo l variazioni di uscitedigitali, quelle di eventuali altre voci non devo rilevarle)

Grazie

luigidibiasi Profilo | Guru


>Ora il problema e' questo: se a seguito lettura lo stato di una
>o piu' schede cambia, quindi lo vado ad aggiornare sul dizionario,
>in che modo potrei accorgermi della variazione per poterla usare
>in questo comando: ?

dato che le schede sono poche (anche 10000 non ti darebbero problemi) puoi tranquillamente scorrere tutto il dizionario e vedere quali sono cambiate
(un ciclo for each)

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

ciao,
C'e' un comando apposta da usare nel ciclo foreach per rilevare il cambiamento? se ad esempio ogni indice contiene 3 voci (a, b, c) e a me niteressa solo il cambiamento di a posso specificarlo?

luigidibiasi Profilo | Guru

>ciao,
>C'e' un comando apposta da usare nel ciclo foreach per rilevare
>il cambiamento? se ad esempio ogni indice contiene 3 voci (a,
>b, c) e a me niteressa solo il cambiamento di a posso specificarlo?
>
>

Ciao,
leggo solo ora però mi son perso di nuovo ... che vuoi dire con un indice ha 3 voci?

il dizionario è fatto così?

Key=a Value=x
Key = b Value = y
Key = c value= z

e ti interessa solo a?

Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

luigidibiasi Profilo | Guru

>> edit questo messaggio va' in risposta all'altro sui thread... non so perché viene visualizzato qui

Certo,
si usano i meccanismi di sincronizzazione (EventWaitHandle)

luigidibiasi Profilo | Guru

Dai un'occhiata alla classe EventWaitHandle su MSDN
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/
http://yadamp.unisa.it/ - YADAMP CMS -

82_marco Profilo | Junior Member

ho dato un occhiata, ma non capisco bene come utilizzarli :-(
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