Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    32

    [VB6] Click su un CommandButton e avvio della computazione

    Ciao a tutti. Ho fatto un programma in Visual Basic 6 dal comportamento anomalo. Se clicco una volta su un pulsante (CommandButton) e attendono che termini l'esecuzione della parte di codice legata al click del pulsante, il tempo impiegato per l'esecuzione è circa 7 volte maggiore di quello impiegato con una pressione del pulsante più e più volte. In sostanza: se schiaccio il button più volte, finchè non compare la clessidra e il computer segnala che l'applicazione non risponde, i tempi di computazione scendono drasticamente. Se il click sul pulsante è uno solo, l'esecuzione del codice prende un tempo circa 7 volte maggiore.
    NB: nonostante il computer segnali che l'applicazione non risponde, i risultati sono corretti ed identici a quelli generati da una singola pressione del button, con una sostanziale differenza nei tempi di calcolo.
    A cosa è dovuto ciò? Come posso evitare che un utente che utilizzi il programma debba cliccare sfrenatamente un CommandButton per avere risultati più celeri?
    Sono a vostra disposizione per qualunque spiegazione necessaria. Vi ringrazio in anticipo per l'aiuto che potrete offrirmi.

  2. #2
    Sinceramente dalla descrizione qualcosa ho capito ma preferirei, se possibile, che tu citassi il codice del command, soprattutto perchè quello che hai detto è un pò strano..

    nonostante il computer segnali che l'applicazione non risponde, i risultati sono corretti ed identici a quelli generati da una singola pressione del button, con una sostanzaìiale differenza nei tempi di calcolo
    ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    32
    Il codice è lungo e serve a riempire ed ordinare una matrice di quasi 5 milioni di righe. Semplici operazioni matematiche per il riempimento della matrice ed un merge sort: niente di eccezionale o di diverso da ciò che ho fatto di solito, se non per la quantità di dati da gestire...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Una matrice di 5 milioni di righe? Beh, vedere il codice sarebbe necessario ...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    32
    codice:
    Private Sub Command2_Click()
    Dim err1 As String
    Dim k As Long
    Dim z As Long
    Dim q As Integer
    Dim righe As Long
    Dim values(2) As String
    Dim a As Long
    Dim b As Long
    Dim c As Long
    Dim somma As Single
    Dim prova As String
    Dim prova2 As String
    Dim perc As Single
    Dim perc2 As Single
    Dim app(2) As Single
    Dim parcheggio(1) As Single
    Dim lastr As Single
    Dim ris As Single
    Dim div As Long
    Dim segno As Integer
    
        If (Combo1.Text = "13") Then
            baseordin = False
        Else
            baseordin = True
        End If
    
        For i = 0 To 13
            tec(i, 0) = Val(unot(i).Text)
            tec(i, 1) = Val(icst(i).Text)
            tec(i, 2) = Val(duet(i).Text)
            gioc(i, 0) = Val(unog(i).Text)
            gioc(i, 1) = Val(icsg(i).Text)
            gioc(i, 2) = Val(dueg(i).Text)
        Next i
        
        For i = 0 To 13
            If (tec(i, 0) = 0 Or tec(i, 1) = 0 Or tec(i, 2) = 0) Then
                err1 = "Non è stato inserito uno o più dati nel picchetto tecnico."
            End If
            
            If (gioc(i, 0) = 0 Or gioc(i, 1) = 0 Or gioc(i, 2) = 0) Then
                If (err1 <> "") Then
                    err1 = err1 & " Non è stato inserito uno o più dati nel picchetto giocato."
                Else
                    err1 = "Non è stato inserito uno o più dati nel picchetto giocato."
                End If
            End If
        Next i
            
        If (err1 <> "") Then
            MsgBox err1 & " Impossibile proseguire!", vbInformation
        Else
            
            prob(0, 0) = 0
            prob(0, 1) = 1
            prob(0, 2) = 1
            righe = 1
            
            For i = 0 To 13
                prob(0, 1) = prob(0, 1) * (tec(i, 0) / 100)
                prob(0, 2) = prob(0, 2) * (gioc(i, 0) / 100)
                If (i = 8) Then
                    prob(0, 4) = prob(0, 1) / prob(0, 2)
                End If
            Next i
            
            prob(0, 3) = prob(0, 1) / prob(0, 2)
            
            For k = 0 To 13
                For z = 1 To 2
                    For i = 0 To righe - 1
                        prob(i + (righe * z), 0) = i + (righe * z)
                        prob(i + (righe * z), 1) = (prob(i, 1) / (tec(k, 0) / 100)) * (tec(k, z) / 100)
                        prob(i + (righe * z), 2) = (prob(i, 2) / (gioc(k, 0) / 100)) * (gioc(k, z) / 100)
                        If (righe < 19683) Then
                            prob(i + (righe * z), 4) = (prob(i, 4) / ((tec(k, 0) / 100) / (gioc(k, 0) / 100))) * ((tec(k, z) / 100) / (gioc(k, z) / 100))
                        Else
                            prob(i + (righe * z), 4) = prob(i, 4)
                        End If
                    Next i
                Next z
                If (righe <> 4782969) Then
                    righe = righe * 3
                End If
           Next k
           
           For i = 0 To 4782968
               c = 1
               For k = 0 To 13
                If (k > 0) Then
                    c = c * 3
                End If
                ris = prob(i, 0) / c
                If (ris > 3) Then
                    ris = ris - (Int(ris / 3) * 3)
                End If
                If (ris < 1) Then
                    segno = 0
                Else
                    If (ris < 2) Then
                        segno = 1
                    Else
                        segno = 2
                    End If
                End If
                prob(i, 5) = prob(i, 5) + ((prob(i, 1) / (tec(k, segno) / 100)) * (1 - (tec(k, segno) / 100)))
                prob(i, 6) = prob(i, 6) + ((prob(i, 2) / (gioc(k, segno) / 100)) * (1 - (gioc(k, segno) / 100)))
                If (baseordin = True) Then
                    prob(i, 3) = prob(i, 1) / prob(i, 2)
                Else
                    prob(i, 3) = prob(i, 5) / prob(i, 6)
                End If
               Next k
           Next i
           
           MergeSort prob, 0, 4782968
           
           For i = 0 To 9
            p(i) = prob(i, 1) & " " & prob(i, 2)
           Next i
            
            ordinamento.Show
            dati.Hide
            sviluppo.Hide
            Unload costo
            Unload montepremi
            Unload apri
            Unload analisi
        End If
    End Sub

  6. #6
    credo serva anche la Sub MergeSort

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    32
    codice:
    Public Sub MergeSort(sArray() As Single, ByVal beginning As Long, ByVal ending As Long)
    
    Dim middle As Long
    
        If (ending > beginning) Then
            ' Recursively sort the two halves of the list.
            middle = (beginning + ending) \ 2
            MergeSort sArray, beginning, middle
            MergeSort sArray, middle + 1, ending
    
            ' Merge the results.
            Merge sArray, beginning, middle, ending
        End If
    End Sub
    
    Public Sub Merge(sArray() As Single, ByVal beginning As Long, ByVal middle As Long, ByVal ending As Long)
    Dim temp_array() As Single
    Dim i As Long
    Dim temp As Long
    Dim counterA As Long
    Dim counterB As Long
    Dim counterMain As Long
    Dim base As Integer
    
        ' Copy the array into a temporary array.
        ReDim temp_array(beginning To ending, 6)
        For i = beginning To ending
            temp_array(i, 0) = sArray(i, 0)
            temp_array(i, 1) = sArray(i, 1)
            temp_array(i, 2) = sArray(i, 2)
            temp_array(i, 3) = sArray(i, 3)
            temp_array(i, 4) = sArray(i, 4)
            temp_array(i, 5) = sArray(i, 5)
            temp_array(i, 6) = sArray(i, 6)
        Next
        
        If (baseordin = True) Then
                base = 1
            Else
                base = 5
        End If
        
        ' counterA and counterB mark the next item to save
        ' in the first and second halves of the list.
        counterA = beginning
        counterB = middle + 1
    
        ' counterMain is the index where we will put the
        ' next item in the merged list.
        counterMain = beginning
        Do While (counterA <= middle) And (counterB <= ending)
            ' Find the smaller of the two items at the front
            ' of the two sublists.
            If (temp_array(counterA, base) >= temp_array(counterB, base)) Then
                ' The smaller value is in the first half.
                sArray(counterMain, 0) = temp_array(counterA, 0)
                sArray(counterMain, 1) = temp_array(counterA, 1)
                sArray(counterMain, 2) = temp_array(counterA, 2)
                sArray(counterMain, 3) = temp_array(counterA, 3)
                sArray(counterMain, 4) = temp_array(counterA, 4)
                sArray(counterMain, 5) = temp_array(counterA, 5)
                sArray(counterMain, 6) = temp_array(counterA, 6)
                counterA = counterA + 1
                'ProgressBar1.Value = ProgressBar1.Value + 0.22
            Else
                ' The smaller value is in the second half.
                sArray(counterMain, 0) = temp_array(counterB, 0)
                sArray(counterMain, 1) = temp_array(counterB, 1)
                sArray(counterMain, 2) = temp_array(counterB, 2)
                sArray(counterMain, 3) = temp_array(counterB, 3)
                sArray(counterMain, 4) = temp_array(counterB, 4)
                sArray(counterMain, 5) = temp_array(counterB, 5)
                sArray(counterMain, 6) = temp_array(counterB, 6)
                counterB = counterB + 1
                'ProgressBar1.Value = ProgressBar1.Value + 0.22
            End If
            counterMain = counterMain + 1
        Loop
    
        ' Copy any remaining items from the first half.
        Do While (counterA <= middle)
            sArray(counterMain, 0) = temp_array(counterA, 0)
            sArray(counterMain, 1) = temp_array(counterA, 1)
            sArray(counterMain, 2) = temp_array(counterA, 2)
            sArray(counterMain, 3) = temp_array(counterA, 3)
            sArray(counterMain, 4) = temp_array(counterA, 4)
            sArray(counterMain, 5) = temp_array(counterA, 5)
            sArray(counterMain, 6) = temp_array(counterA, 6)
            counterA = counterA + 1
            counterMain = counterMain + 1
                'ProgressBar1.Value = ProgressBar1.Value + 0.22
        Loop
    
        ' Copy any remaining items from the second half.
        Do While (counterB <= ending)
            sArray(counterMain, 0) = temp_array(counterB, 0)
            sArray(counterMain, 1) = temp_array(counterB, 1)
            sArray(counterMain, 2) = temp_array(counterB, 2)
            sArray(counterMain, 3) = temp_array(counterB, 3)
            sArray(counterMain, 4) = temp_array(counterB, 4)
            sArray(counterMain, 5) = temp_array(counterB, 5)
            sArray(counterMain, 6) = temp_array(counterB, 6)
            counterB = counterB + 1
            counterMain = counterMain + 1
            'ProgressBar1.Value = ProgressBar1.Value + 0.22
        Loop
    End Sub

  8. #8
    La domanda può sembrare stupida... utilizzi Option Explicit nel Form?
    Dico questo perchè se non lo utilizzi, quando premi il tasto, il pc si trova a dover creare in diretta lo spazio in memoria di prob(xxx,y) (che non vedo dichiarata), che è di notevole dimensioni.
    (4.782.969 x 7) single

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Con piu' di 130 M di spazio da allocare per quella matrice, penso che il tuo PC abbia problemi di paginazione e quindi il comportamento descritto sia spiegabile.

    Del resto, pressare piu' volte di seguito il bottone, senza avere la certezza che l'esecuzione della sub sia terminata, non ha senso ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.