Novità

sviluppo sstemi in vbnet

  • Creatore Discussione Creatore Discussione LuigiB
  • Data di inizio Data di inizio
pensavo che con il ritardo massimo bisognasse contare tutto
in pratica salti tutte le colonne che contengono quello specifico ambo se non rispetta la condizione.
se l ambo 1.2 è a ritardo zero salti tutte le colonne che contengono 1.2
quindi se ha storico 50 e noi cerchiamo storici superiori saltiamo le colonne che lo contengono, perchè lo storico è quello con valore piu basso.
le frequenze bisogna contare e qui potrebbero tornare utili più thread .
 
esattamente .piu che ritardo zero è corrett odire ritardo piu basso di quello gia trovato .. della colonna in esame si cacola il ritardo a partire da classe 2 e se la fortuna vuole che proprio il primo ambo sia a ritardo piu basso di quello gia trovato è il caso in cui si mangia piu colonne ... siccome con i thread si fa un bel po di colonen alla volta non gli capitano spesso colonne che lo inducono a saltare percio funge meglio se gli passi meno colonne a thread ..fermo restando che con questo sistema è meglio il single thread
 
Adesso mi sono buttato a letto che oggi preso dall entusiasmo sono stato seduto tutto il pomeriggio.
Domani mattina studio e cerco di capire per bene il codice che hai scritto.
Tutti i video che ho guardato ti assicuro che nessuno usava il metodo join.
I più complicati utilizzavano .sleep credo per non incrociare i dati.
Cmq tra tutti i codici che ci hai regalato , qua siamo ad un altro livello.
 
Ciao Luigi & The Legend, forse il libro di cui alla immagine potrebbe giovare nello spremere (spero) un po' di piu' da Vb.Net, visto che sale di un gradino sopra i threads, ragionando per tasks, di fatto alleviando le pene del programmatore, che dopo la vecchia corsa ai Ghz, e' l'unico responsabile della velocita' del software che riesce a produrre.

La storia recita che prima, nel mondo DOS e poi WIN, per aumentare le prestazioni del software i programmatori contavano sui nuovi processori con clock piu' elevati, ma... ad un certo punto di questa storia la corsa ai Ghz termino' e il mondo DOS/WIN si dedico' a far crescere i cores lasciando il compito esclusivamente ai programmatori di fare il software piu' veloce possibile... compatibilmente con i problemi di sicurezza a tutti i livelli.

Buon lavoro e buona lettura

p.s. da quello che ho letto sembra che in VS vi sia anche la libreria Task Parallel Library (TPL) per il framework .Net a cui fa riferimento il libro

1701142958226.png
 
Grazie Rookie , libro sicuramente interessante .. ora deve partire la caccia alla copia pirata :-) che sti mattoni possono costare pure 120 euro a libro ..eheh vabe non si dovrebeb dire :-) ma sapete come sono io non ho peli sulla lingua ..
Qualche test con la libreria tpl (parallel.for )è gia stato fatto ma non ha avuto lo stesso esito positivo che abbiamo avuto con i thread dove siamo stati piu fortunati.
Comunque la cosa piu imprtante che è emersa con questi nostri timidi approcci è che un algoritmo efficiente (quando possibile) è la cosa migliore,massima efficienza con il minimo delle risorse , esistono libroni enormi sugli algoritmi , io non ho fatto l'università quindi non ho mai dato esami sull'argomento e potrebbero mancarmi (anzi mi mancano) quelle basi che ti danno la possibilità di pensare all'algoritmo migliore o di pensarne uno all'occorrenza anche se qualche risultato lo otteniamo lo stesso facendo lavorare le meningi.
 
Grazie Rookie , libro sicuramente interessante .. ora deve partire la caccia alla copia pirata :) che sti mattoni possono costare pure 120 euro a libro ..eheh vabe non si dovrebeb dire :) ma sapete come sono io non ho peli sulla lingua ..
Qualche test con la libreria tpl (parallel.for )è gia stato fatto ma non ha avuto lo stesso esito positivo che abbiamo avuto con i thread dove siamo stati piu fortunati.
Comunque la cosa piu imprtante che è emersa con questi nostri timidi approcci è che un algoritmo efficiente (quando possibile) è la cosa migliore,massima efficienza con il minimo delle risorse , esistono libroni enormi sugli algoritmi , io non ho fatto l'università quindi non ho mai dato esami sull'argomento e potrebbero mancarmi (anzi mi mancano) quelle basi che ti danno la possibilità di pensare all'algoritmo migliore o di pensarne uno all'occorrenza anche se qualche risultato lo otteniamo lo stesso facendo lavorare le meningi.
Caro Luigi, i libri sono importanti per renderti edotto del tipo di battaglia che potrai combattere ma per aver ragione del problema che in un determinato momento hai per le mani, devi dar fondo alle tue motivazioni e a tutta la tua intuizione per avere successo. E tu questo lo hai imparato sul campo. La certificazione col piú alto valore, é quella conseguita nella vita reale, con problemi e ostacoli veri non quelli costruiti a far da esempi per scrivere i libri. E mi tocca di affermare, senza temi di smentita, che di queste certificazioni, puro frutto di spremute meningee, ne potresti sfoggiare tante, qualora ricorresse il caso. Lode a te, Luigi.

Mi fa molto piacere che hai modo di leggere il libro senza…colpo ferire! Ciao
 
con il parallel for si ottengono i risultati migliori , ed è pure tutto piu facile ..

1701161182236.png

prendiamo in considerazione il nostro problema , lo scopo è trovare la cinquina piu ritardata per ambo nel minor tempo possibile, per farlo vogliamo sfruttare a pieno le capacità della macchina.
La parte pesante della ricerca è quella di confrontare ogni cinquina che noi sviluppiamo tramite i cicli for nidificati , con le estrazioni dell'archivio.

la parte di sviluppo delle cinquine non è particolarmente critica . Rimuovendo la parte della statistica , lasciando solo i cicli for nidificati e l'assegnazione della lunghetta nell'array sul mio pc ci vogliono 6 secondi (testato in debug mode quindi pure leggermente piu lento)
1701161650230.png
quind ia questi 6 secondi necessari per sviluppare tutte le cinquine si aggiunge il tempo necessario per calcolare il ritardo di ogni cinquina.

Con l'approccio multithread abbiamo impostato la cosa creando un array , ogni elemento dell'array rappresentava una delle cinquine sviluppate.
Una volta riempito l'array fino al limite previsto partivano i differenti thread ciascuno dei quali analizzava la sua parte di colonne sviluppate (quindi una porzione di array) e al termine verificava se la cinquina col ritardo piu alto che aveva trovato lui (il thread) era migliore di quella finale se si aggiornava il valore di quest'ultima , facendo pero attenzone a sincronizzare l'assegnazione di questa variable che essendo globale è condivisa da tutti ithread.
Il processo continuava finche non finivano le colonen da sviluppare e al termine ovviamente si aveva la cinquina col ritardo piu alto come da obiettivo.


Ora con l'approccio parallelo invece di gestire noi i thread e il blocco di colonne sul quale lo stesso deve operare ,possiamo eseguire l'operazione di calcolo del ritardo tramite un ciclo for parallelo in quanto per ogni iterazione del ciclo ogni calcolo su quella cinquina è indipendente cioè non è influenzato alle altre operazioni che si svolgono in altri indici del ciclo.

Rientriamo in questo caso qui , proprio il primo specificato nel libro suggerito da Rookie

1701162977160.png


Con il parallel for distribuiamo praticamente senza fareniente di speciale il carico di lavoro pesante (cioè il calcolo del ritardo della singola cinquina) sui core presenti sulla macchina.
Durante il calcolo però vogliamo evitare di andare a toccare la variabile globale ( cioè quella che alla fine conterrà la lunghetta che cerchiamo) perche dobbiamo evitare operazioni che potrebbero andare in conflitto a causa proprio del parallelismo.

Come risolviamo ? Al termine del ciclo for parallelo quando a tutte le colonne del nostro array è stato attribuito il ritardo introduciamo un
ciclo sequenziale (quindi normalissimo ciclo for) che fa il confronto e l'aggiornamento del valore globale .

per fare la prova Legend inserisci questa routine.

Codice:
  Sub TestParallelFor()


        Dim k1 As Integer, k2 As Integer, k3 As Integer, k4 As Integer, k5 As Integer
        Dim nSvilTmp As Integer
        Dim strctParam As New STRUCT_PARAM_THREAD
        Dim nLunghetteTot As Integer
        Dim watch As New Stopwatch

        watch.Start()

        nLunghetteTot = 5000 ' HScrollBar2.Value
        ReDim aLunghette(nLunghetteTot)

        LunghettaPiuRitardata.Ritardo = 0

        strctParam.SetRuote(TextBox1.Text)
        strctParam.nSorte = 2
        strctParam.nClasse = 5

        Dim aN(5) As Integer
        For k1 = 1 To 86
            Label1.Text = k1
            Application.DoEvents()
            aN(1) = k1
            For k2 = k1 + 1 To 87
                aN(2) = k2
                For k3 = k2 + 1 To 88
                    aN(3) = k3
                    For k4 = k3 + 1 To 89
                        aN(4) = k4
                        For k5 = k4 + 1 To 90
                            aN(5) = k5
                            nSvilTmp += 1
                            aLunghette(nSvilTmp).Numeri.SetNumeri(aN)
                            If nSvilTmp = nLunghetteTot Then
                                Parallel.[For](1, nSvilTmp, Sub(index)
                                                                aLunghette(index).Ritardo = CalcolaRitardoLunghetta(aLunghette(index), strctParam.nSorte, nEstrTotali, strctParam.aRuote, strctParam.nRuote)
                                                            End Sub)
                                For k As Integer = 1 To nSvilTmp
                                    If aLunghette(k).Ritardo > LunghettaPiuRitardata.Ritardo Then
                                        LunghettaPiuRitardata = aLunghette(k)
                                    End If
                                Next
                                nSvilTmp = 0
                            End If
                        Next
                    Next
                Next
            Next
        Next

        If nSvilTmp > 0 Then
            Parallel.[For](1, nSvilTmp, Sub(index)
                                            aLunghette(index).Ritardo = CalcolaRitardoLunghetta(aLunghette(index), strctParam.nSorte, nEstrTotali, strctParam.aRuote, strctParam.nRuote)
                                        End Sub)
            For k As Integer = 1 To nSvilTmp
                If aLunghette(k).Ritardo > LunghettaPiuRitardata.Ritardo Then
                    LunghettaPiuRitardata = aLunghette(k)
                End If
            Next
        End If

        watch.Stop()

        MsgBox("Lunghetta <" & LunghettaPiuRitardata.Numeri.StringaNumeri & ">" & vbCrLf & " al ritardo  : " & LunghettaPiuRitardata.Ritardo.ToString & vbCrLf & "  Tempo millisecondi : " & watch.ElapsedMilliseconds.ToString)

    End Sub
 
Buon giorno a tutti:)
Il libro è fortunatamente gratis,
Ma esiste in italiano?
Altrimenti sicuramente c è in biblioteca.
Finisco di fare una prova e mi metto a studiare il nuovo script.
Altrimenti non trovo più come correggere un errore.
 
Ho inserito la sub nel modulo
ma hai riscritto la funzione caricaRitardoLunghetta , mi sembra di capire , hai inserito structParam.nRuote
l ho cancellato tanto lo legge ugualmente , la faccio partire tanto hai gia inserito il button 2
 
lanciata
5 secondi
ovviamente
l altro algoritmo quello dedicato è più veloce
ma è un ottimo risultato pensando ai 17 secondi
Fantastico :)

mi meraviglio che qualcuno non ti abbia regalato non dico una torta , ma almeno un pasticciotto :ROFLMAO::ROFLMAO::ROFLMAO:
Grazie luigi :)
grazie anche a te Rookie per il suggerimento del libro :)
 
con il parallel for si ottengono i risultati migliori , ed è pure tutto piu facile ..

Vedi l'allegato 2272806

prendiamo in considerazione il nostro problema , lo scopo è trovare la cinquina piu ritardata per ambo nel minor tempo possibile, per farlo vogliamo sfruttare a pieno le capacità della macchina.
La parte pesante della ricerca è quella di confrontare ogni cinquina che noi sviluppiamo tramite i cicli for nidificati , con le estrazioni dell'archivio.

la parte di sviluppo delle cinquine non è particolarmente critica . Rimuovendo la parte della statistica , lasciando solo i cicli for nidificati e l'assegnazione della lunghetta nell'array sul mio pc ci vogliono 6 secondi (testato in debug mode quindi pure leggermente piu lento)
Vedi l'allegato 2272807
quind ia questi 6 secondi necessari per sviluppare tutte le cinquine si aggiunge il tempo necessario per calcolare il ritardo di ogni cinquina.

Con l'approccio multithread abbiamo impostato la cosa creando un array , ogni elemento dell'array rappresentava una delle cinquine sviluppate.
Una volta riempito l'array fino al limite previsto partivano i differenti thread ciascuno dei quali analizzava la sua parte di colonne sviluppate (quindi una porzione di array) e al termine verificava se la cinquina col ritardo piu alto che aveva trovato lui (il thread) era migliore di quella finale se si aggiornava il valore di quest'ultima , facendo pero attenzone a sincronizzare l'assegnazione di questa variable che essendo globale è condivisa da tutti ithread.
Il processo continuava finche non finivano le colonen da sviluppare e al termine ovviamente si aveva la cinquina col ritardo piu alto come da obiettivo.


Ora con l'approccio parallelo invece di gestire noi i thread e il blocco di colonne sul quale lo stesso deve operare ,possiamo eseguire l'operazione di calcolo del ritardo tramite un ciclo for parallelo in quanto per ogni iterazione del ciclo ogni calcolo su quella cinquina è indipendente cioè non è influenzato alle altre operazioni che si svolgono in altri indici del ciclo.

Rientriamo in questo caso qui , proprio il primo specificato nel libro suggerito da Rookie

Vedi l'allegato 2272808


Con il parallel for distribuiamo praticamente senza fareniente di speciale il carico di lavoro pesante (cioè il calcolo del ritardo della singola cinquina) sui core presenti sulla macchina.
Durante il calcolo però vogliamo evitare di andare a toccare la variabile globale ( cioè quella che alla fine conterrà la lunghetta che cerchiamo) perche dobbiamo evitare operazioni che potrebbero andare in conflitto a causa proprio del parallelismo.

Come risolviamo ? Al termine del ciclo for parallelo quando a tutte le colonne del nostro array è stato attribuito il ritardo introduciamo un
ciclo sequenziale (quindi normalissimo ciclo for) che fa il confronto e l'aggiornamento del valore globale .

per fare la prova Legend inserisci questa routine.

Codice:
  Sub TestParallelFor()


        Dim k1 As Integer, k2 As Integer, k3 As Integer, k4 As Integer, k5 As Integer
        Dim nSvilTmp As Integer
        Dim strctParam As New STRUCT_PARAM_THREAD
        Dim nLunghetteTot As Integer
        Dim watch As New Stopwatch

        watch.Start()

        nLunghetteTot = 5000 ' HScrollBar2.Value
        ReDim aLunghette(nLunghetteTot)

        LunghettaPiuRitardata.Ritardo = 0

        strctParam.SetRuote(TextBox1.Text)
        strctParam.nSorte = 2
        strctParam.nClasse = 5

        Dim aN(5) As Integer
        For k1 = 1 To 86
            Label1.Text = k1
            Application.DoEvents()
            aN(1) = k1
            For k2 = k1 + 1 To 87
                aN(2) = k2
                For k3 = k2 + 1 To 88
                    aN(3) = k3
                    For k4 = k3 + 1 To 89
                        aN(4) = k4
                        For k5 = k4 + 1 To 90
                            aN(5) = k5
                            nSvilTmp += 1
                            aLunghette(nSvilTmp).Numeri.SetNumeri(aN)
                            If nSvilTmp = nLunghetteTot Then
                                Parallel.[For](1, nSvilTmp, Sub(index)
                                                                aLunghette(index).Ritardo = CalcolaRitardoLunghetta(aLunghette(index), strctParam.nSorte, nEstrTotali, strctParam.aRuote, strctParam.nRuote)
                                                            End Sub)
                                For k As Integer = 1 To nSvilTmp
                                    If aLunghette(k).Ritardo > LunghettaPiuRitardata.Ritardo Then
                                        LunghettaPiuRitardata = aLunghette(k)
                                    End If
                                Next
                                nSvilTmp = 0
                            End If
                        Next
                    Next
                Next
            Next
        Next

        If nSvilTmp > 0 Then
            Parallel.[For](1, nSvilTmp, Sub(index)
                                            aLunghette(index).Ritardo = CalcolaRitardoLunghetta(aLunghette(index), strctParam.nSorte, nEstrTotali, strctParam.aRuote, strctParam.nRuote)
                                        End Sub)
            For k As Integer = 1 To nSvilTmp
                If aLunghette(k).Ritardo > LunghettaPiuRitardata.Ritardo Then
                    LunghettaPiuRitardata = aLunghette(k)
                End If
            Next
        End If

        watch.Stop()

        MsgBox("Lunghetta <" & LunghettaPiuRitardata.Numeri.StringaNumeri & ">" & vbCrLf & " al ritardo  : " & LunghettaPiuRitardata.Ritardo.ToString & vbCrLf & "  Tempo millisecondi : " & watch.ElapsedMilliseconds.ToString)

    End Sub
Luigi, oltre che intriso di talento sei pure un fulmine di guerra! Complimenti meritati!
 
lanciata
5 secondi
ovviamente
l altro algoritmo quello dedicato è più veloce
ma è un ottimo risultato pensando ai 17 secondi
Fantastico :)

mi meraviglio che qualcuno non ti abbia regalato non dico una torta , ma almeno un pasticciotto :ROFLMAO::ROFLMAO::ROFLMAO:
Grazie luigi :)
grazie anche a te Rookie per il suggerimento del libro :)
Lieto di essere stato utile…
 
Luigi, oltre che intriso di talento sei pure un fulmine di guerra! Complimenti meritati!
post scriptum... ma vale anche per @i legend :) che ha voglia di sporcarsi le mani e... non pensare al suo fardello (il dolore fisico che lo accompagna) vi e' anche la versione del libro per il c++ ovvero l'evasione dalla prigione del framework .Net (leggi managed code; cioe' poter parlare al ferro a quattr'occhi) che fa uso di una libreria diversa (ovviamente) ma sintassi equivalente. A quanto pare cambierebbe solo il file header da includere e il modo di codificare qualche istruzione operativa! Quindi, mi aspetto che i vostri prossimi attrezzi di gioco facciano un salto di livello WARP.... ;) nel tempo e/o nello spazio!


p.s. credo sia anche possibile, usare Vb.Net per le UX e il C++ per la sua forza bruta nel fare il lavoro sporco...

1701169499155.png
 
Ultima modifica:
la curva di apprendimento del c++ è molto elevata , io non ho mai visto niente di c++ al massimo qualche video suu youtube dei primi rudimenti , quindi non posso essere produttivo su quel linguaggio , di impararlo non se ne parla :-) .. su questo vi dovrò deludere..
 
la curva di apprendimento del c++ è molto elevata , io non ho mai visto niente di c++ al massimo qualche video suu youtube dei primi rudimenti , quindi non posso essere produttivo su quel linguaggio , di impararlo non se ne parla :) .. su questo vi dovrò deludere..
Il futuro é una delle poche cose su cui riflettere prima di ipotecarlo, le altre sono la salute, le mogli e la propria casa :) comunque il suggerimento ipotetico era per chi (@i legend ) si diletta per hobby non per chi vive del proprio lavoro!
 
Luigi la curva di apprendimento del c++ è molto elevata per noi mortali .
La tua forma mentis ti permetterebbe di arrivare a codificare in neanche un mese .
È quello che ti inventi che fa la differenza.
 

Ultima estrazione Lotto

  • Estrazione del lotto
    sabato 23 novembre 2024
    Bari
    33
    80
    86
    52
    25
    Cagliari
    67
    57
    59
    05
    80
    Firenze
    31
    32
    58
    88
    77
    Genova
    40
    39
    23
    36
    81
    Milano
    28
    58
    45
    25
    38
    Napoli
    20
    82
    23
    44
    57
    Palermo
    76
    56
    88
    62
    31
    Roma
    12
    81
    59
    74
    72
    Torino
    46
    53
    72
    45
    23
    Venezia
    04
    12
    42
    64
    20
    Nazionale
    63
    44
    78
    10
    55
    Estrazione Simbolotto
    Torino
    43
    42
    12
    39
    22
Indietro
Alto