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

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:
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.
 
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" ;)
 
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....
 
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:
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.
 
Back
Topo