1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[VB .Net] Como mostrar uma progress bar (a progredir) enquanto desenho um gráfico

Discussão em 'Programação' iniciada por bITmApp, 4 de Abril de 2006. (Respostas: 6; Visualizações: 4912)

  1. bITmApp

    bITmApp Power Member

    Olá,

    Como o título diz o meu problema resume-se a mostrar uma progress bar numa form enquanto um gráfico é desenhado noutra. Já criei uma form à parte só com a progress bar mas não consigo metê-la a progredir enquanto o gráfico é desenhado. :(

    Código:
    For i = 0 To x_tempo.Length - 1
        grafico(i + 1, 0) = x_tempo(i)
        grafico(i + 1, 1) = y_curva(i)
        grafico(i + 1, 2) = x_tempo(i)
        grafico(i + 1, 3) = y_aço(i)
    Next
    
    AxMSChart1.Plot.UniformAxis = False
    AxMSChart1.ChartData = grafico
    Este código é da form onde vai ser desenhado o gráfico, na da progress bar não tenho nada. Já tentei meter dentro do ciclo "For" a progredir com cada "i" mas depois na parte de desenhar (AxMSChart1.ChartData = grafico) a progress bar já vai a 100% e aquilo por vezes ainda demora algum (bastante) tempo dando a aparência de ter empancado. Há alguma maneira de contabilizar o progresso do desenho?

    Obrigada por qualquer tipo de ajuda que me possam dar :)
     
    Última edição: 4 de Abril de 2006
  2. Galbne_PT

    Galbne_PT Power Member

    Boas!

    Pois é, o problema é k estas dentro do ciclo for e a aplicação n envia informação em tempo real p outra formas.
    Tentar fazer 1 threads p o ciclo e outro thread p a progress bar e faz troca de mensagem entre os threads fazendo k cada thread espere um pelo outro, tens de saber programar mt bem com threads se n estas sujeito a k a aplicação n sai da espera entre os thread. Vai à net procurar por tutorials.
    Não é mt eficiente mas deve dar.

    Não sei se em vb.net tens Delegates e Events, se tiveres outra solução é usa-los..... Em c# usando os Delegates e Events e tb Application.DoEvents() é a solução mais eficaz.

    Espero k tenha, pelo menos, dar-te alguma ideia....

    Cumps.
     
  3. bITmApp

    bITmApp Power Member

    Pois, entretanto desisti de mostrar o progresso do desenho do gráfico porque fartei-me de procurar no google e não encontrei nada. Acho que não dá mesmo para mostrar.

    Agora estou a pensar mostrar uma progress bar infinita, ou seja, anda sempre de um lado para o outro tipo "K.I.T.T." :P

    Andei a ler umas coisas sobre "marquee progress bars" e acho que é o que pretendo, excepto que corre tudo bem até que corro o programa e depois a progress bar aparece mas não é actualizada :confused:

    Parece-me que como disseste vou ter que andar a mexer em threads coisas assim, o que não sei fazer :P Lá vou eu de volta para o google ver o que consigo encontrar :)



    PS: Não é "sujeito" é "sujeita" ;)
     
  4. bITmApp

    bITmApp Power Member

    Já resolvi, podem fechar o tópico :)
     
  5. Craveiro

    Craveiro Folding Member

    Pois, podias era explicar como fizeste, assim se mais alugem tiver a mesma dúvida encontra aqui a resposta, o que sempre enriquece o tópico e o fórum....
     
  6. bITmApp

    bITmApp Power Member

    foi com threads e com delegates como o Galbne_PT sugeriu (obg!) :)

    acho q o meu código n é exemplo para ninguém visto q é tudo "de ouvido" mas cá vai ;)



    a form do gráfico ficou assim (com outras coisas q n interessam para este caso):

    Código:
    Imports System.Threading
    
    Public Class Gráfico
    
        Private trd As Thread
        Delegate Sub dialogClose()
    
        Private Sub Gráfico_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.VisibleChanged
            If Me.Visible Then
                trd = New Thread(AddressOf ThreadTask)
                trd.IsBackground = True
                trd.Start()
    
                Dim grafico(0 To x_tempo.Length + 1, 0 To 3) As Object
                Dim i As Short
    
                grafico(0, 0) = "Compartimento"
                grafico(0, 1) = "Compartimento"
                grafico(0, 2) = "Aço"
                grafico(0, 3) = "Aço"
    
                For i = 0 To x_tempo.Length - 1
                    grafico(i + 1, 0) = x_tempo(i)
                    grafico(i + 1, 1) = y_curva(i)
                    grafico(i + 1, 2) = x_tempo(i)
                    grafico(i + 1, 3) = y_aço(i)
                Next
    
                AxMSChart1.Plot.UniformAxis = False
                AxMSChart1.ChartData = grafico
    
                pbClose()
            End If
        End Sub
    
        Private Sub ThreadTask()
            pbGráfico.DefInstance.ShowDialog()
        End Sub
    
        Private Sub pbClose()
            If pbGráfico.DefInstance.InvokeRequired Then
                Dim d As New dialogClose(AddressOf pbClose)
                pbGráfico.DefInstance.Invoke(d)
            Else
                pbGráfico.DefInstance.Close()
                pbGráfico.DefInstance.Dispose()
            End If
        End Sub
    
    End Class

    edit: esqueci-me de dizer q a progress bar ficou como marquee
     
    Última edição: 6 de Abril de 2006
  7. Galbne_PT

    Galbne_PT Power Member

    Ainda bem k pode ajudar!

    Em relação do teu codigo n é exemplo p ninguém, ninguém se importa com o código,
    tds kerem é ver a funcionar :P
    E kem n sabe já tem um pilar p começar.... p no futuro melhorar.. :D

    Cumps.
     

Partilhar esta Página