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

Progressbar e thread

Discussão em 'Programação' iniciada por PJ, 5 de Dezembro de 2008. (Respostas: 3; Visualizações: 1914)

  1. PJ

    PJ Power Member

    Bom é o seguinte :

    Tenho alguns cálculos que demoram bastante tempo a ser executados, e alguns deles eu não tenho acesso pois estão em dlls mas desconfio que tb sejam executados em threads.

    Fiz uma classe que instância uma nova thread de uma função que inicia e actualiza a progress bar.

    Basicamente é isto :

    Código:
    [SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][SIZE=2] progbar2 [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]New[/COLOR][/SIZE][SIZE=2] ProgressBar[/SIZE]
    [SIZE=2]progbar2.Style = ProgressBarStyle.Marquee[/SIZE]
    [SIZE=2]progbar2.Show()[/SIZE]
    [SIZE=2]_StartTime = Now[/SIZE]
    [SIZE=2][COLOR=#008000]'progbar2.Lbl_ActualValue.Text = "00:00"[/COLOR][/SIZE]
    [SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][SIZE=2] span [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2] TimeSpan[/SIZE]
    [SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][SIZE=2] spanAux [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]String[/COLOR][/SIZE]
    [SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][SIZE=2] num [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Integer[/COLOR][/SIZE][SIZE=2] = 0[/SIZE]
    [SIZE=2][COLOR=#0000ff]Do[/COLOR][/SIZE]
    [SIZE=2]Thread.Sleep(100)[/SIZE]
    [SIZE=2]_EndTime = Now[/SIZE]
    [SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE][SIZE=2] num = 10 [/SIZE][SIZE=2][COLOR=#0000ff]Then[/COLOR][/SIZE]
    [SIZE=2] span = _EndTime.Subtract(_StartTime)[/SIZE]
    [SIZE=2][COLOR=#0000ff] If[/COLOR][/SIZE][SIZE=2] span.ToString.Length > 8 [/SIZE][SIZE=2][COLOR=#0000ff]Then[/COLOR][/SIZE]
    [SIZE=2]  spanAux = span.ToString.Remove(8)[/SIZE]
    [SIZE=2][COLOR=#0000ff] End[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE]
    [SIZE=2][COLOR=#0000ff] If[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Not[/COLOR][/SIZE][SIZE=2] spanAux [/SIZE][SIZE=2][COLOR=#0000ff]Is[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Nothing[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Then[/COLOR][/SIZE]
    [SIZE=2][COLOR=#008000] 'Aqui actualiza a label com o tempo[/COLOR][/SIZE]
    [SIZE=2][COLOR=#008000] 'progbar.Lbl_ActualValue.Text = spanAux.Remove(0, 3)[/COLOR][/SIZE]
    [SIZE=2][COLOR=#0000ff] End[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE]
    [SIZE=2] num = 0[/SIZE]
    [SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE]
     
     
    [SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE][SIZE=2] progbar2.Text <> _texto [/SIZE][SIZE=2][COLOR=#0000ff]Then[/COLOR][/SIZE]
    [SIZE=2] progbar2.Text = _texto[/SIZE]
    [SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE]
     
    [SIZE=2]num += 1[/SIZE]
    [SIZE=2][COLOR=#0000ff]Loop[/COLOR][/SIZE]
    [/COLOR][/SIZE]
    
    Assim consigo enviar mensagens ao utilizador através da progressbar utilizando uma property texto que é shared.

    O problema é que a progress bar fica parada após alguns 5 ou 6 segundos. A thread continua a correr pois se colocar lá um break point quando ela está parada ele detecta o breakpoint.

    Instânciei a thread desta forma :

    Código:
    [SIZE=2]_Th1 = [/SIZE][SIZE=2][COLOR=#0000ff]New[/COLOR][/SIZE][SIZE=2] Thread([/SIZE][SIZE=2][COLOR=#0000ff]AddressOf[/COLOR][/SIZE][SIZE=2] StartThread)[/SIZE]
    [SIZE=2][COLOR=#008000]'_Th1.Priority = ThreadPriority.Highest[/COLOR][/SIZE]
    [SIZE=2]_Th1.IsBackground = [/SIZE][SIZE=2][COLOR=#0000ff]True[/COLOR][/SIZE]
    [SIZE=2]_Th1.Start()[/SIZE]
    
    Alguém me poderá dar uma ajuda de forma a isto não acontecer.

    Cumps
     
  2. Tomb4000

    Tomb4000 Power Member

    so trabalhei com progressbar em c++/cli, c# e delphi, essa progressbar nao tem position? Escala? do que vai depender a posição actual da progressbar?
     
  3. PJ

    PJ Power Member

    Esta progress bar é do estilo marquee, pelo que ela continua a rodar até eu enviar um comando de abort da thread.

    Apenas serve para indicar ao utilizador o que está a acontecer, o form associado a essa progress bar num minuto pode dizer "A processar dados..." e no outro "A gravar dados...", coisas assim do género.
     
  4. Tomb4000

    Tomb4000 Power Member

    If num = 10 Then

    Nesta comparação não estas a comparar tas a atribuir, poderá ser isso?

    Brigado pela explicação.

    ps: nao pesco nada de visual b

     

Partilhar esta Página