none
Problema com Thread + classe + evento RRS feed

  • Pergunta

  • Olá

     

    Estou fazendo alguns testes com threads.

     

    Fiz uma classe para utilizar o conceito de threadpool.

    A classe funciona muito bem, porem, coloquei uma progressbar no form para mostrar o andamento do processamento.

     

    Para cada thread que termina a minha classe dispara o evento  objThreadPool_ThreadFinalizada()

    Dentro deste evento chamo uma sub que fica no form para controlar o delegate e atualizar a progressbar

     

      Private Sub objThreadPool_ThreadFinalizada() Handles objThreadPool.ThreadFinalizada
    
        AtualizaProgresso()
    
      End Sub
    

    quando o fluxo entra na sub acima identifico que a progressbar está sendo requerida conforme codigo abaixo:

      Private Sub AtualizaProgresso()
    
        'ProgressBar1.PerformStep()
    
        If ProgressBar1.InvokeRequired Then
          ProgressBar1.Invoke(New AtualizaProgressoDelegate(AddressOf AtualizaProgresso))
        Else
          ProgressBar1.Value += 1
          ProgressBar1.PerformStep()
        End If
    
        Application.DoEvents()
    
      End Sub
    

    o fluxo então vai para a linha "ProgressBar1.Invoke(New AtualizaProgressoDelegate(AddressOf AtualizaProgresso))" so que quando chama a sub AtualizaProgresso pelo delegate a aplicação trava.

    O que estou fazendo de errado?

    Eu não quero ter que usar "CheckForIllegalCrossThreadCalls = false" quero fazer da forma mais correta possível.

     

    Alguem poderia dar uma dica?

     

    Obrigado


    Analista Programador .Net www.fabner.com.br
    sábado, 4 de junho de 2011 14:20

Todas as Respostas

  • olá pessoal

    para não criar um topico repetido coloco aqui a referencia do meu topico criado na divisão do windows Forms.

    Quem puder dar uma olhada e postar alguma dica eu agradeço.

    http://social.msdn.microsoft.com/Forums/pt-BR/clientept/thread/6035feb7-03be-4ab2-81e1-da6493ae926b

     

    Abraços

     

     


    Analista Programador .Net www.fabner.com.br
    • Mesclado Rogério OhashiModerator segunda-feira, 6 de junho de 2011 16:26 A mesma dúvida já está em discussão em outra Thread
    sábado, 4 de junho de 2011 18:05
  • Olá,

    Poderia colocar o código da classe: AtualizaProgressoDelegate(AddressOf AtualizaProgresso)

    []s,


    Carlos dos Santos
    blog: www.carloscds.net 
    twitter: @cdssoftware

    domingo, 5 de junho de 2011 23:13
  • Bom dia Carlos,

    AtualizaProgressoDelegate é somente um delegate que criei, pois encontrei na internet alguns exemplos que funcionavam desta forma.

    Public Delegate Sub AtualizaProgressoDelegate()
    

    Abraço

     

     

     


    Analista Programador .Net www.fabner.com.br
    segunda-feira, 6 de junho de 2011 13:27
  • Bom no C# utilizo assim.

     

    Sempre que houver uma Thread com interação com qq controle, você deve efetuar o Join, uma exemplo:

       public delegate void HandlerStatus(int value);
            public void ChangeStatus(int value)
            {
                if (progressBar1.InvokeRequired)
                {
                    HandlerStatus hndstatus = new HandlerStatus(ChangeStatus);
                    progressBar1.Invoke(hndstatus, new object[] { value });
                }
                else
                {
                    progressBar1.Value = value;
                }
            }

     

    Desta forma sempre que o metodo ChageStatus for chamado dentro de uma thread ele vai conseguir mudar o valor do status.

     

     

    []´s


    Rafael Vieira Arquiteto de Software
    segunda-feira, 6 de junho de 2011 14:25
  • Bom no C# utilizo assim.

     

    Sempre que houver uma Thread com interação com qq controle, você deve efetuar o Join, uma exemplo:

       public delegate void HandlerStatus(int value);
            public void ChangeStatus(int value)
            {
                if (progressBar1.InvokeRequired)
                {
                    HandlerStatus hndstatus = new HandlerStatus(ChangeStatus);
                    progressBar1.Invoke(hndstatus, new object[] { value });
                }
                else
                {
                    progressBar1.Value = value;
                }
            }

     

    Desta forma sempre que o metodo ChageStatus for chamado dentro de uma thread ele vai conseguir mudar o valor do status.

     

     

    []´s


    Rafael Vieira Arquiteto de Software


    Obrigado Rafael, vou testar e posto a resposta.

     

    Abraço


    Analista Programador .Net www.fabner.com.br
    segunda-feira, 6 de junho de 2011 17:15
  • Rafael, infelizmente não deu certo

     

    A aplicação entra em DeadLock.

     

    Olha como ficou a chamada:

     

      Private Sub objThreadPool_ThreadFinalizada() Handles objThreadPool.ThreadFinalizada
    
        AtualizaProgresso(1)
    
      End Sub
    
      Private Delegate Sub AtualizaProgressoDelegate(ByVal Valor As Integer)
      Private Sub AtualizaProgresso(ByVal Valor As Integer)
    
        If ProgressBar1.InvokeRequired Then
    
          Dim objDelegate As AtualizaProgressoDelegate = New AtualizaProgressoDelegate(AddressOf AtualizaProgresso)
          ProgressBar1.Invoke(objDelegate, Valor)
    
        Else
    
          ProgressBar1.Value += Valor
    
        End If
    
      End Sub
    
    <br/>
    
    Tem alguma outra dica?
    
    <br/>
    
    Abraço
    


    Analista Programador .Net www.fabner.com.br
    terça-feira, 7 de junho de 2011 02:00
  • Fabner,

    Conseguiu solucionar essa questão?


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    sexta-feira, 17 de junho de 2011 13:03
    Moderador
  • Não
    Analista Programador .Net www.fabner.com.br
    sábado, 2 de julho de 2011 15:23
  • Fagner, tenta fazer assim:

     Private Sub objThreadPool_ThreadFinalizada() Handles objThreadPool.ThreadFinalizada
      Me.Invoke(New AtualizaProgressoDelegate(AddressOf AtualizaProgresso), 50) '50 é o valor que irá atualiza
     End Sub
    
     Private Delegate Sub AtualizaProgressoDelegate(ByVal Valor As Integer)
    
     Private Sub AtualizaProgresso(ByVal Valor As Integer)
      ProgressBar1.Value += Valor
     End Sub
    



    Bruno Ferreira de Souza
    MSP - Microsoft Student Partner
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    www.maestrodotnet.com.br
    @BrunoMaestro
    sexta-feira, 15 de julho de 2011 16:13