02/05 16:54
iz1kbp
Buongiorno a tutti,
Sono alla ricerca di un suggerimento su come velocizzare una mia routine, che ora comunque funziona.
Per informazione, creo un byte secondo il protocollo ArtNet per il pilotaggio di fari intelligenti (luci per spettacoli)
Questo il funzionamento per sommi capi:
Il programma memorizza un una matrice di 512 caselle, il valore dei singoli canali dmx (valore della luce) che vanno appunto da 1 a 512, per 255 livelli ciascuno.
Nel momento in cui modifico il valore di un canale, es il 10 lo porto al max, vado a modificare solo la casella,, ad esempio, generalech(10) =255.
Il protocollo prevere che questa matrice sia mandata in continuo da 1 a 512 sulla rete.
Di queste matrici, il protocollo ArtNet, ne prevede...16530.
Come si vede, io creo il byte da spedire , scansionando tutta la matrice dei calori dei canali DMX da 1 a 512 (il codice compreso tra XXX e YYY)
Usando solo una matrice, il ciclo for riesce a star dentro nel normale refresh dell'invio dei dati ( lo faccio ogni 10 ms)..se però utilizzo 3 matrici, il ciclo FOR mi fa perdere molti dati, perchè se io cambio il valore di un canale nella matrice 1, ma nel frattempo sta processando la matrice 2 e poi deve fare la matrice 3, perdo 3 informazioni.
La domanda è :esiste un metodo per evitare il ciclo for, per creare questi bytes tutto in un colpo?
Ho letto in forum inglesi di una API "RtlMoveMemory API function to copy data" che muove appunto blocci di memoria.Purtroppo le mie conoscenze sono un po limitate.qualcuno potrebbe illuminarmi/suggerirmi la corretta sintassi
dovre essere una cosa del genere ma non riesco a capire la sintassi giusta
grazie a chiunque mi possa dare una mano.
Mario
Sono alla ricerca di un suggerimento su come velocizzare una mia routine, che ora comunque funziona.
Per informazione, creo un byte secondo il protocollo ArtNet per il pilotaggio di fari intelligenti (luci per spettacoli)
Private Sub Timer7_Timer() 'stringa artnet>>>>>>>>>>>>>> artnet0 = "Art-Net" For n = 1 To 7 singolo = Mid(artnet0, n, 1) buffer(n - 1) = Asc(singolo) ' creo la frase Art-net Next 'fine stringa artnet >>>>>>>>>> buffer(7) = Val(vbNullChar) ' richiesto carattere null 'fine creazione stringa>>>>>> buffer(8) = "0" 'tipo di dato > 5000 (80) per dmx buffer(9) = "80" ' lo buffer(10) = "0" 'protocollo hi >1400 buffer(11) = "14" ' lo If sequenza > 255 Then sequenza = 0 buffer(12) = sequenza '"0" 'sequenza> numero di trasmissione 0 per disabilitare, 1toff buffer(13) = "0" 'physical porta dmx in ingresso ? 'universo dmx >>>>>>>>>>>>>>>> buffer(14) = "0" 'subuni 'universo buffer(15) = "0" 'net 'lunghezza array dmx>>>>>>>>>> buffer(16) = "2" 'lunghezza array dmx > hi > 1 per un singolo canale buffer(17) = "0" 'lunghezza lo >0 'fine costruzione stringa ora carico i valori dei 512 canali >>>>>>>>>>>>>>>>>>>>>>>>>> (XXX) Dim artnetch As Integer For artnetch1 = 1 To 512 buffer(17 + artnetch) = generalech(artnetch) >>> questa è la matrice in cui salvo i valori dei singoli canali GENERALCH(CANALE)=VALORE Next 'fine costruzione pacchetto canali >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> (YYY) 'Spedisco la stringa via UDP stringa = StrConv(buffer, vbUnicode) On Error GoTo errore_udp If sockattivo(0) = True And host0(0) = 1 Then sockMain.SendData stringa
Questo il funzionamento per sommi capi:
Il programma memorizza un una matrice di 512 caselle, il valore dei singoli canali dmx (valore della luce) che vanno appunto da 1 a 512, per 255 livelli ciascuno.
Nel momento in cui modifico il valore di un canale, es il 10 lo porto al max, vado a modificare solo la casella,, ad esempio, generalech(10) =255.
Il protocollo prevere che questa matrice sia mandata in continuo da 1 a 512 sulla rete.
Di queste matrici, il protocollo ArtNet, ne prevede...16530.
Come si vede, io creo il byte da spedire , scansionando tutta la matrice dei calori dei canali DMX da 1 a 512 (il codice compreso tra XXX e YYY)
Usando solo una matrice, il ciclo for riesce a star dentro nel normale refresh dell'invio dei dati ( lo faccio ogni 10 ms)..se però utilizzo 3 matrici, il ciclo FOR mi fa perdere molti dati, perchè se io cambio il valore di un canale nella matrice 1, ma nel frattempo sta processando la matrice 2 e poi deve fare la matrice 3, perdo 3 informazioni.
La domanda è :esiste un metodo per evitare il ciclo for, per creare questi bytes tutto in un colpo?
Ho letto in forum inglesi di una API "RtlMoveMemory API function to copy data" che muove appunto blocci di memoria.Purtroppo le mie conoscenze sono un po limitate.qualcuno potrebbe illuminarmi/suggerirmi la corretta sintassi
dovre essere una cosa del genere ma non riesco a capire la sintassi giusta
CopyBytes buffer(da 17 a 512), ByVal generalech (da 1 a 512), 512
grazie a chiunque mi possa dare una mano.
Mario
aaa